動態規劃 之多重部分和問題 難度 3星

2021-08-13 22:43:55 字數 2016 閱讀 7254

#include 

/*** 原題:

* 有n種不同大小的數字

a[i],

每種各m[i]個,

判斷是否可以從這些數字之中

* 選出若干個使它們的和恰好為k*/

#define n 6

#define

k 35

static inta[n] = ;

static intm[n] = ;

/***

思路如下:*

設定子問題

:選擇前

i(i<=n)

種數字,

判斷是否可以從這些數字中選出若干個

,使它們的和恰好為

j(j<=k),

* res=1

代表可以

, res=0

代表不可以

* 確定邊界

:i=n

時, res=0 , j=0

時, res=1

*///

解法1:

遞迴intsolve_1(inti,

intj)

return0;}

//解法

2:遞迴

+記憶陣列

static intmemo[n+1][k+1];

intsolve_2(inti,

intj)

returnmemo[i][j] = 0;}

//解法

3:遞推

static intdp[n+1][k+1];

intsolve_3()

for(inti = 0

; i <= n

; ++i)

for(inti = n-1

; i >= 0

; --i) }}

returndp[0][k];}//

解法4:

遞推優化

static intdpx[k+1];

intsolve_4()

dpx[0] = 0

;for(inti = 0

; i < n

; ++i)else if(j < a[i] || dpx[j-a[i]] <= 0)else}}

returndpx[k] >= 0;}

intmain()

}printf("solve_2:

%d\n

", solve_2(0

, k));

printf("solve_3:

%d\n

", solve_3());

// for (int i = 0; i <= n ; ++i)

// printf("\n");

// }

printf("solve_4:

%d\n

", solve_4());

return0

;}

執行結果:

solve_1:1

solve_2:1

solve_3:1

solve_4:1

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

問題描述 有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 用前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 的話就是可以選出,否則便是不能選出。利用...