zoukankan      html  css  js  c++  java
  • 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;
    //}
    



















  • 相关阅读:
    GNU binutils工具使用(转)
    wget下载整个网站
    Qt中使用第三方的数据库(Sqlite)存储并读取文件本体
    thinkpad T400不能hibernate解决方案,ubuntu 10.10
    android 2.3 StrictMode 使用
    N900 Dual boot(meego& maemo)
    maemo环境安装问题和解决方案(ubuntu 10.04)
    shell中判断一个参数是否为整型
    linux中的块设备和字符设备(转)
    对聊天室调试总结
  • 原文地址:https://www.cnblogs.com/nyist-xsk/p/7264909.html
Copyright © 2011-2022 走看看