(2 15)多重部分和問題

2021-10-08 01:19:39 字數 1689 閱讀 3152

如何定義遞推關係會影響到最終的複雜度

方案1:

dp[i+1][j] := 用前i種數字是否能加和成j

要想用前i種數字加和成j,我們需要用前i-1種數字加和成j, j-a[i], … j-a[i]*m[i] 中的某一種

#include

#include

#include

#include

using

namespace std;

const

int max_n =

100;

const

int max_k =

100000

;bool dp[max_n+1]

[max_k+1]

;// dp陣列

//輸入

int n =3;

// 陣列的長度

int k =17;

// 目標和數

int a[3]

=;// 不同的資料

int m[3]

=;// 不同資料的個數

void

solve()

}}if(dp[n]

[k])

printf

("yes\n");

else

printf

("no\n");

}int

main()

方案2:o(nk)

dp求bool 運算會浪費時間,在此方案中,我們不光求出能否得到目標的和數,同時把得到時a[i] 這個數還剩下多少個計算出來,以減少複雜度。

dp[i+1][j] := 用前i種數加和得到j時第i種數最多能剩餘多少個(不能加和得到i的情況下為-1)

如果前i-1個數加和能得到j的話,第i個數就可以留下m[i]個,

如果前i種數加和出j-a[i]時第i種數還剩下k(k>0)的話,用著i種數加和j時第i種數就能剩下k-1個。

;// dp陣列

//輸入

int n =3;

// 陣列的長度

int k =17;

// 目標和數

int a[3]

=;// 不同的資料

int m[3]

=;// 不同資料的個數

void solve()}

if(dp[k]

>=

0) printf(

"yes\n");

else printf(

"no\n");

}int main(

)

多重部分和問題

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