百練2755 神奇的口袋 DP

2021-09-22 05:52:40 字數 1963 閱讀 9572

2755:神奇的口袋

檢視 提交 統計 提示 提問

總時間限制: 10000ms 記憶體限制: 65536kb

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

輸入輸入的第一行是正整數n (1 <= n <= 20),表示不同的物品的數目。接下來的n行,每行有乙個1到40之間的正整數,分別給出a1,a2……an的值。

輸出輸出不同的選擇物品的方式的數目。

樣例輸入320

2020

樣例輸出

3

遞迴
#include

using

namespace std;

int a[30]

;int n;

intsearch

(int i,

int w)

//從前i件物品中湊成體積w的種類數

圖示樣例輸入為:

32 2 2

體積為4時候的情況

dfs寫法
#include

using

namespace std;

int a[30]

;int n;

int sum, ans;

void

dfs(

int idx)

}for

(int k = idx; k <= n; k++)}

intmain()

dfs(1)

; cout << ans << endl;

return0;

}

二維dp
#include

using

namespace std;

int a[30]

;int dp[22]

[41];

int n;

intsearch()

for(

int i =

0; i <= n; i++

)for

(int i =

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

}return dp[n][40

];}int

main()

cout <<

search()

<< endl;

return0;

}

一維dp
#include

using

namespace std;

int a[30]

;int dp[41]

;int n;

intsearch()

dp[0]

=1;for

(int i =

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

return dp[40]

;}intmain()

cout <<

search()

<< endl;

return0;

}

百練 2755 神奇的口袋

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

百練 2755 神奇的口袋

遞迴 include include include includeusing namespace std const int maxn 30 int n,d maxn int dp int w,int n int main 人人為我動歸 狀態定義 揹包容量為i時,選完前j件物品後,能達到該容量的最...

百練 2755 神奇的口袋

第一種解法是很經典的動態規劃,對於值域較小的題目,還可以採用第二種方法,考慮對值域空間 即對容積的可達性進行動態規劃。這道題裡面採用第二種解法還會有空間上的優化。有時把值域作為一種狀態不單單是一種解法,還有可能是唯一的解法。如hdu 1574 rp問題 描述有乙個神奇的口袋,總的容積是40,用這個口...