#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 的話就是可以選出,否則便是不能選出。利用...