POJ 3260 The Fewest Coins(背包问题)
【题目链接】 http://poj.org/problem?id=3260
【题目大意】
给出你拥有的货币种类和每种的数量,商店拥有的货币数量是无限的,
问你买一个价值为m的物品,最少的货币流通数量为多少
【题解】
我们可以计算出买不同价值的物品,在没有找钱情况下的最少用币数量,
记为dp[i],这个可以用多重背包来完成,对于商店来说,我们可以计算出,
对于不同额度的找零,最少用币数量,记为f[i],
我们发现,对于货币流通最少,就是求dp[i+m]+f[i]的最小值,
由鸽巢原理可得我们只要计算maxw*maxw+m的dp值就可以了。
【代码】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int INF=0x3f3f3f3f; int m,n,w[110],c[110],dp[24563],f[24563]; int main(){ while (~ scanf ( "%d%d" ,&n,&m)){ int maxn=0; for ( int i=1;i<=n;i++) scanf ( "%d" ,&w[i]),maxn=max(maxn,w[i]); for ( int i=1;i<=n;i++) scanf ( "%d" ,&c[i]); maxn=maxn*maxn+m+1; memset (dp,INF, sizeof (dp)); dp[0]=0; for ( int i=1;i<=n;i++){ if (c[i]*w[i]>=maxn){ for ( int j=w[i];j<=maxn;j++)dp[j]=min(dp[j],dp[j-w[i]]+1); } else { for ( int k=1;k<c[i];k<<=1){ for ( int j=maxn;j>=w[i]*k;j--)dp[j]=min(dp[j],dp[j-w[i]*k]+k); c[i]-=k; } for ( int j=maxn;j>=w[i]*c[i];j--)dp[j]=min(dp[j],dp[j-w[i]*c[i]]+c[i]); } memset (f,INF, sizeof (f));f[0]=0; } for ( int i=1;i<=n;i++){ for ( int j=w[i];j<=maxn;j++)f[j]=min(f[j],f[j-w[i]]+1); } int ans=INF; for ( int i=0;i<=maxn-m;i++)ans=min(ans,dp[i+m]+f[i]); if (ans==INF)ans=-1; printf ( "%d\n" ,ans); } return 0; } |
愿你出走半生,归来仍是少年
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥
2014-04-13 HDU 1709 The Balance
2014-04-13 HDU 2152 Fruit
2014-04-13 HDU 1398 Square Coins
2014-04-13 HDU 3571 N-dimensional Sphere
2014-04-13 HDU 2451 Simple Addition Expression
2014-04-13 HDU 3589 Jacobi symbol
2014-04-13 HDU 2815 Mod Tree