入門DP 神奇的口袋

2021-07-10 23:08:23 字數 1322 閱讀 4011

總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

3

2020

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可以從這些物品中選擇一些,如果選...