百練 2755 神奇的口袋

2022-05-22 12:24:08 字數 1301 閱讀 6433

第一種解法是很經典的動態規劃,對於值域較小的題目,還可以採用第二種方法,考慮對值域空間-即對容積的可達性進行動態規劃。

這道題裡面採用第二種解法還會有空間上的優化。

有時把值域作為一種狀態不單單是一種解法,還有可能是唯一的解法。如hdu 1574 rp問題

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

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

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

動規解法:

人人為我

1

//#define local

2 #include 3 #include 4 #include 5

using

namespace

std;67

int dp[45][45]; //

dp[i][j]表示前j件物品總體積是i的方案總數

8int a[45];9

10int main(void)11

26int

j;27

for(i = 1; i <= 40; ++i)

28for(j = 1; j <= n; ++j)

2934 printf("

%d\n

", dp[40

][n]);

35return0;

36 }

**君我為人人

其中j從40倒著迴圈是考慮到,如果從1開始迴圈會導致重複加和的情況,從而結果錯誤。

1

//#define local

2 #include 3 #include 4 #include 5

using

namespace

std;67

int sum[42]; //

sum[i]表示到達體積i的方案總數89

int main(void)10

27 ++sum[input];28}

29 printf("

%d\n

", sum[40

]);30

return0;

31 }

**君

百練 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)

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