• dp 神奇的口袋



    有一个神奇的口袋,总的容积是40,用这个口袋可以变出一 些物品,这些物品的总体积必须是40。  John现在有n(1≤n ≤ 20)个想要得到的物品,每个物品 的体积分别是a1,a2……an。John可以从这些物品中选择一 些,如果选出的物体的总体积是40,那么利用这个神奇的口 袋,John就可以得到这些物品。现在的问题是,John有多少 种不同的选择物品的方式。 


    输入  输入的第一行是正整数n (1 <= n <= 20),表示不同的物品的 数目。接下来的n行,每行有一个1到40之间的正整数,分别 给出a1,a2……an的值。   输出  输出不同的选择物品的方式的数目。   输入样例 3  20  20  20   输出样例 3 

    ////动规
    #include <iostream>
    #include<string.h>
    using namespace std;
    int a[30];
    int N;
    int Ways[40][30];
    //Ways[i][j]数组表示从前j种物品里凑出体积i的方法数
    int main()
    {
        cin >> N;
        memset(Ways,0,sizeof(Ways));
        for( int i = 1; i <= N; ++ i )
        {
            cin >> a[i];
            Ways[0][i] = 1;//Ways[0][i]存储的是正好能整减的数据标记为1
        }
        Ways[0][0] = 1;//标记输入的第一个数符合情况为1 
        for( int w = 1 ; w <= 40; ++ w )
        {
            for( int k = 1; k <= N; ++ k )
            {
                Ways[w][k] = Ways[w][k-1];//在找到符合条件的数据之前,Ways内的数都是0
                if( w-a[k] >= 0)   Ways[w][k] += Ways[w-a[k]][k-1];//根据ways标记的进行加一
            }
        }
        cout << Ways[40][N];
        return 0;
    }
    
    
    
    //"我为人人"型递推解法 
    //#include <iostream>
    //using namespace std;
    //#define MAX 41
    //int main()
    //{
    //    int n,i,j,input;
    //    int sum[MAX];
    //    for(i=0; i<MAX; i++) sum[i]=0;
    //    cin >> n;
    //    for(i=0; i<n; i++)
    //    {
    //        cin >> input;
    //        for(j=40; j>=1; j--)
    //            if(sum[j]>0 && j+input <= 40)
    //                sum[j+input] += sum[j];
    ////如果j有sum[j]种方式可达,则每种方式加上input就可达 j + input
    //        sum[input]++;
    //    }
    //    cout << sum[40] << endl;
    //    return 0;
    //}
    
    
    
    
    ////递归
    //#include <iostream>
    //using namespace std;
    //int a[30];
    //int N;
    //int Ways(int v,int n )
    //{
    //    // 从前n种物品中选择一些,凑成体积v的做法数目
    //    if( v == 0 )   return 1;
    //    if( n <= 0 )   return 0;
    //    return Ways(v, n-1 ) + Ways(v-a[n], n-1 );
    //}
    //int main()
    //{
    //    cin >> N;
    //    for( int i = 1; i <= N; ++ i )
    //        cin >> a[i];
    //    cout << Ways(40,N);
    //    return 0;
    //}
    



















  • 相关阅读:
    和Mac有关的所有快捷键整理
    Python学习笔记
    在PHP的AWS SDK 的上传功能中指定Content-Type
    Docker 部署 Yapi
    PHP 队列
    数据库设计之一 数据库范式
    docker centos PHP7.2 安装 bcmath数学扩展
    记联调微信支付,调起微信支付之后显示支付验证失败
    记Windows 2012 FTP配置之后 客户端登陆报错
    记一次 MAC 安装 homebrew 报错解决
  • 原文地址:https://www.cnblogs.com/nyist-xsk/p/7264909.html
Copyright © 2020-2023  润新知