神奇的口袋

2021-08-07 23:47:14 字數 1135 閱讀 4931

原題:

有乙個神奇的口袋,總的容積是40,用這個口袋可以變出一些物品,這些物品的總體積必須是40。john現在有n個想要得到的物品,每個物品的體積分別是a1,a2……an。john可以從這些物品中選擇一些,如果選出的物體的總體積是40,那麼利用這個神奇的口袋,john就可以得到這些物品。現在的問題是,john有多少種不同的選擇物品的方式。

乙個揹包問題 依然是兩種解決辦法 遞推和動歸

總感覺遞推比較好理解,這道題問的是有多少種方式。狀態轉移方程:dp(x-1,y-a[i])or dp(x-1, y) x代表物品編號 y代表重量 a是儲存重量的陣列。可以不選該物品或者選擇後重量減去當前物品重量。

#include

using namespace std;

#define maxn 50

int a[maxn];

int dp(int x, int y)

if(y == 0)

return dp(x - 1, y) + dp(x - 1, y - a[x]); }

int main(int argc, const char * argv)

printf("%d\n", dp(n, 40));

return 0;

}*/動態規劃,要定義二維陣列,

dp[w][k]就是從第k個物品開始取得重量為w的方法個數,依然是選或者不選兩種情況 但是這兩種情況不應該是並列關係嗎?這裡似乎是先不選 再討論選?

可以這樣想,就理解了:

if( w-a[k] >= 0)

else dp[w][k] = dp[w][k-1];

#include

using

namespace

std;

#define maxn 50

inta[

maxn

], dp[

maxn

][maxn];

intmain()

for( i =

1; i <= n; i++) dp

[0][0

] =1;

for( w =

1; w <=

40; w ++) }

}printf

("%d\n",dp

[40][n]); }

神奇的口袋

時間限制 1 sec 記憶體限制 32 mb 有乙個神奇的口袋,總的容積是40,用這個口袋可以變出一些物品,這些物品的總體積必須是40。john現在有n個想要得到的物品,每個物品的體積分別是a1,a2 an。john可以從這些物品中選擇一些,如果選出的物體的總體積是40,那麼利用這個神奇的口袋,jo...

神奇的口袋

於牛客考研真題 題目描述 有乙個神奇的口袋,總的容積是40,用這個口袋可以變出一些物品,這些物品的總體積必須是40。john現在有n個想要得到的物品,每個物品的體積分別是a1,a2 an。john可以從這些物品中選擇一些,如果選出的物體的總體積是40,那麼利用這個神奇的口袋,john就可以得到這些物...

神奇的口袋

有乙個神奇的口袋,總的容積是40,用這個口袋可以變出一些物品,這些物品的總體積必須是40。john現在有n個想要得到的物品,每個物品的體積分別是a1,a2 an。john可以從這些物品中選擇一些,如果選出的物體的總體積是40,那麼利用這個神奇的口袋,john就可以得到這些物品。現在的問題是,john...