zoukankan      html  css  js  c++  java
  • 百练2755:神奇的口袋(简单dp)

    描述有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40。John现在有n个想要得到的物品,每个物品的体积分别是a1,a2……an。John可以从这些物品中选择一些,如果选出的物体的总体积是40,那么利用这个神奇的口袋,John就可以得到这些物品。现在的问题是,John有多少种不同的选择物品的方式。输入输入的第一行是正整数n (1 <= n <= 20),表示不同的物品的数目。接下来的n行,每行有一个1到40之间的正整数,分别给出a1,a2……an的值。输出输出不同的选择物品的方式的数目。样例输入

    3
    20
    20
    20
    

    样例输出

    3
     1 #include<iostream>
     2 #include<cstdlib>
     3 #include<cstring>
     4 using namespace std;
     5 
     6 int main()
     7 {
     8     int n;
     9     int v[50];
    10     int dp[50][50];//dp[i][j]表示从前j个物品中凑出体积为i的做法有多少种
    11     cin >> n;
    12     for (int i = 1; i <= n; ++i)
    13     {
    14         cin >> v[i];
    15     }
    16     memset(dp, 0, sizeof(dp));
    17     //边界条件:有物品,凑出体积为0的做法为1(一个物品都不放)
    18     for (int i = 0; i <= n; ++i)
    19     {
    20         dp[0][i] = 1;
    21     }
    22     for(int i = 1;i<=40;++i)
    23         for (int j = 0; j <= n; ++j)
    24         {
    25             dp[i][j] = dp[i][j-1];//不放第j个物品的放法
    26             if (i >= v[j])
    27             {
    28                 dp[i][j] += dp[i - v[j]][j - 1];
    29             }
    30         }
    31     cout << dp[40][n] << endl;
    32     return 0;
    33 }
  • 相关阅读:
    Advanced Configuration Tricks
    Reviewing the Blog Module
    Editing and Deleting Data
    Making Use of Forms and Fieldsets
    Understanding the Router
    SQL Abstraction and Object Hydration
    Preparing for Different Databases
    Java学习理解路线图
    Openstack学习历程_1_视频
    CentOS安装Nginx负载
  • 原文地址:https://www.cnblogs.com/knmxx/p/9523827.html
Copyright © 2011-2022 走看看