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;
}
posted @ 2023-08-24 00:16  失控D大白兔  阅读(8)  评论(0编辑  收藏  举报