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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】