問題描述
有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...