多重部分和問題

2022-05-01 15:51:13 字數 1028 閱讀 3099

題意:有n種不同大小的數字ai 每種各mi個 判斷是否可以從這些數字之中選出若干個使它們的和恰好為k

樸素做法  為三次方

有一種 nk的做法:

dp[i][j]表示 前i個數  湊到j最多剩下多少個mi

dp[i][j]

1.如果dp[i][j]>=0 那麼肯定為mi

2.如果 j3. 其他情況  dp[i][j-ai]]-1;

#includeusing

namespace

std;

//input by bxd

#define rep(i,a,b) for(int i=(a);i<=(b);i++)

#define repp(i,a,b) for(int i=(a);i>=(b);--i)

#define ri(n) scanf("%d",&(n))

#define rii(n,m) scanf("%d%d",&n,&m)

#define riii(n,m,k) scanf("%d%d%d",&n,&m,&k)

#define rs(s) scanf("%s",s);

#define ll long long

#define pb push_back

#define clr(a,v) memset(a,v,sizeof a)

/////////////////////////////////

/#define inf 0x3f3f3f3f

const

int n=100+5

;int

n,m,dp[n];

inta[n],m[n],k;

intmain()

else

if(j0)

dp[j]=dp[j-a[i]]-1

;

if(dp[k]>=0)printf("

yes\n");

else printf("

no\n");

return0;

}

view code

多重部分和問題

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