多重部分和問題

2021-10-01 03:43:22 字數 879 閱讀 9163

有n種大小不同的數字ai、每種各mi個、判斷是否可以從這些數字之中選出若干使它們的和恰好為k

dp[i + 1][j]表示前i種數字是否能加成j

為了用前i種數字加成j、也就需要滿足前i-1種數字加和成j, j-ai, j-2ai…j-mi*ai中的一種、由此、我們得到關係式

#include

using

namespace std;

int n, k, a[

101]

, m[

101]

;//分別是n種數,目標和、n個數及每個數的個數

bool dp[

101]

[100001];

intmain()

}}if(dp[n]

[k])cout <<

"yes"

<< endl;

else cout <<

"no"

<< endl;

return0;

}

我們發現這樣時間複雜度比較高、可以優化一步

dp[i+1][j]定義為用前i種數加和得到j時第i種數最多能剩餘多少個

按照這種遞推關係,

這樣如果前i-1個數加和能得到j的話,第i個數就可以留下mi個.

前i種數加和出j-ai時第i種數還剩下k的話(k>0)的話、用這i種數加和j時第i種數就能剩下

k-1個

dp[i+1][j] = }if

(dp[k]

>=

0)cout <<

"yes"

<< endl;

else cout <<

"no"

<< endl;

return0;

}

多重部分和問題

有 n 種物品,第i種物品的每個物品的價值是 ai 數目是 mi 判斷是否可以選擇若干數字使得價值和是k。1 n 100 1 ai,m i,10 5 1 k 105 看作揹包大小是k,物品的價值和體積都是ai 物品數目是 mi 的多重揹包。如果最大價值是 k 的話就是可以選出,否則便是不能選出。利用...

多重部分和問題

有n種不同大小的數字a i 每種各m i 個。判斷是否可以從這些數字之中選出若干使它們的和恰好為k。dp i 表示以a i 為末尾的最長上公升子串行的長度。include include include includeusing namespace std define maxn 10010 int...

多重部分和問題

有n種不同大小的數字a i 每種各m i 個。判斷是否可以從這些數字中選出若干使它們的和恰好為k。限制條件 1 n 100,1 a i m i 100000,1 k 100000 這個問題可以用dp求解,如何定義遞推式影響最後的時間複雜度。定義dp i 1 j 用前i 1種數字 數字的編號是從0到i...