P2347 砝码称重
设有1g、2g、3g、5g、10g、20g的砝码各若干枚(其总重≤1000),可以表示成多少种重量?
1. 动态规划
多重背包问题,结合0-1背包求解
void ZeroOnePack(int cost,vector<int> &dp){
for(int j=1000;j>=cost;j--)
dp[j] += dp[j-cost];
}
void MutipLePack(int cost,int cnt,vector<int> &dp){
int k = 1;
while(k<cnt){
ZeroOnePack(cost*k,dp);
cnt-=k;
k*=2;
}
ZeroOnePack(cost*cnt,dp);
}
int maxval(vector<int>&cnt){
int n = cnt.size();
vector<int> cost = {1,2,3,5,10,20};
vector<int> dp(1001);
dp[0] = 1;//方案数
int res = 0;
for(int i=0;i<n;i++){
if(cnt[i]==0) continue;//跳过该数
MutipLePack(cost[i],cnt[i],dp);
}
for(int j=1;j<=1000;j++)
if(dp[j]>0) res++;
return res;
}