多重部分和

2021-09-25 18:45:07 字數 1318 閱讀 4365

有n中大小不同的數字ai,每種有mi個,判斷從這些數中取出若干能否組成數k

可以輸出yes 不可以輸出no

dp[i][j] 是第i個數組合數j時剩餘幾個a[i],不能組合為-1

未優化遞推式(容易理解,實現後觀察加深理解)

①dp[i][j] >= 0  dp[i+1][j] = m[i]

②dp[i+1][j-a[i]] <=0 || j③其他情況 dp[i+1][j] = dp[i+1][j-a[i]] - 1

#include#include#include#include#include#include#include#include#define max 100

#define inf 10000000

using namespace std;

int n,k;

int a[max];

int m[max];

int dp[max][max];

//dp函式

void solve()

//不能得到

else if(j> n;

for(int i=0; i> a[i];

for(int i=0; i> m[i];

in >> k;

solve();

cout << dp[n][k] << endl;

if()

cout << "yes" 《優化後

①dp[j] >= 0;     dp[j]=m[i]

②dp[j-a[i]] <=0 || j③其他情況 dp[j] = dp[j-a[i]] - 1

#include#include#include#include#include#include#include#include#define max 100

#define inf 10000000

using namespace std;

int n,k;

int a[max];

int m[max];

int dp[max];

//dp函式

void solve()

//不能得到

else if(j> n;

for(int i=0; i> a[i];

for(int i=0; i> m[i];

in >> k;

solve();

if(dp[k] > 0)

cout << "yes" << endl;

else

cout << "no"

return 0;

}

多重部分和問題

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