總time limit:
10000ms
memory limit:
65536kb
description
有乙個神奇的口袋,總的容積是40,用這個口袋可以變出一些物品,這些物品的總體積必須是40。john現在有n個想要得到的物品,每個物品的體積分別是a
1,a2……a
n。john可以從這些物品中選擇一些,如果選出的物體的總體積是40,那麼利用這個神奇的口袋,john就可以得到這些物品。現在的問題是,john有多少種不同的選擇物品的方式。
input
輸入的第一行是正整數n (1 <= n <= 20),表示不同的物品的數目。接下來的n行,每行有乙個1到40之間的正整數,分別給出a
1,a2……a
n的值。
output
輸出不同的選擇物品的方式的數目。
sample input
32020
20
sample output
3
這個題有點像揹包的思想;
要求可以滿足要求的次數;樣例是1 3 ;2 3 ; 1 2 ;三種剛好滿足40;
討論狀態 (選 或者 不選) ;
針對dp[i][j] 就為滿足重量i選擇的前j種商品的方法;
所以初始狀態 dp[0][j] ( j>=0&&j<=n) == 1 ; (每個商品都考慮不選,則都有1種);
所以如果上個狀態不選擇j物品, 則 dp[i][j] = dp[i][j-1];
如果滿足 i - a[j] >= 0 , 就選擇這個物品 , 則有當前狀態的選擇次數+上個狀態選擇的次數;dp[i][j] += dp[i-a[j][j-1] ;
ac**:
#include #include using namespace std;
int a[30];
int n;
int dp[40][30];//dp[i][j]表示從前j種物品裡湊出體積i的方法數
int main()
dp[0][0] = 1;
for( int i = 1 ; i <= 40; i++ ) }
cout << dp[40][n]<
神奇的口袋(回溯 DP
有乙個神奇的口袋,總的容積是40,用這個口袋可以變出一些物品,這些物品的總體積必須是40。john現在有n個想要得到的物品,每個物品的體積分別是a1,a2 an。john可以從這些物品中選擇一些,如果選出的物體的總體積是40,那麼利用這個神奇的口袋,john就可以得到這些物品。現在的問題是,john...
dp專題 神奇的口袋
有乙個口袋容積為m,有n個物品,題目的體積為a1,a2,a3 an。把m裝滿有多少種不同的裝法。遞迴 int dfs int n,int m 從n個物品中選出總體積為m的選法 遞推 dp i j dp i 1 j j a i dp i 1 j a i 0 初始條件 dp i 0 1 0 i n 全部...
poj 2755 神奇的口袋 dp
poj 2755 神奇的口袋 dp 總時間限制 10000ms 記憶體限制 65536kb 描述 有乙個神奇的口袋,總的容積是40,用這個口袋可以變出一些物品,這些物品的總體積必須是40。john現在有n個想要得到的物品,每個物品的體積分別是a1,a2 an。john可以從這些物品中選擇一些,如果選...