多重部分和問題(動態規劃)

2021-09-28 22:21:36 字數 1186 閱讀 3693

問題描述

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

限制條件

1 <= n <= 100

1 <= ai, mi, <= 100000

1 <= k <= 100000

定義bool  dp[i+1][j] 前i個數(含)能否加和為 j

for (int k = 0; k*a[i] <= j && k <= m[i]; k++)

dp[i+1][j] |= dp[i][j-k*a[i]];

這樣程式的複雜度是o(k∑mi), 並且 bool dp 的資訊有點浪費

定義dp[i+1][j] 前 i+1個數加和得到 j 時 第i個數能剩餘多少個(沒有時為-1)

dp[i+1][j] =

這樣複雜度o(nk)

輸入:

335

8322

17

輸出:

yes
code:

#include

using

namespace std;

const

int max=

100000

;int n,k;

int a[max]

,m[max]

;bool dp[

100]

[max]

;void

solve()

}if(dp[n]

[k])

cout<<

"yes"

cout<<

"no"

<}void

solve1()

for(t=

0; t<=k; t++

) cout<<<

" ";

cout<(d[k]

>=0)

cout<<

"yes"

cout<<

"no"

<}int

main()

return0;

}

多重部分和問題 動態規劃

這個問題可以用動態規劃求解,不過如何定義遞推關係會影響最終的複雜度。定義 dp i 1 j 用前i中數字是否能加和成j。能加成則為1,不能為0 1 能加成數字j,那麼第i個數字可能需要k個 k 0 1 m i dp i j dp i j k a i 1 2 不能加成數字j.dp i j 0 incl...

多重部分和問題

有 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...