百练2755:神奇的口袋(简单dp)
生活随笔
收集整理的這篇文章主要介紹了
百练2755:神奇的口袋(简单dp)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
描述有一個神奇的口袋,總的容積是40,用這個口袋可以變出一些物品,這些物品的總體積必須是40。John現(xiàn)在有n個想要得到的物品,每個物品的體積分別是a1,a2……an。John可以從這些物品中選擇一些,如果選出的物體的總體積是40,那么利用這個神奇的口袋,John就可以得到這些物品。現(xiàn)在的問題是,John有多少種不同的選擇物品的方式。輸入輸入的第一行是正整數(shù)n (1 <= n <= 20),表示不同的物品的數(shù)目。接下來的n行,每行有一個1到40之間的正整數(shù),分別給出a1,a2……an的值。輸出輸出不同的選擇物品的方式的數(shù)目。樣例輸入
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 }
總結(jié)
以上是生活随笔為你收集整理的百练2755:神奇的口袋(简单dp)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Fiori Elements里的Refe
- 下一篇: 百度云认证签名生成