poj-1384 Piggy-Bank
# include <cstdio> # include <cstring> # include <iostream> # include <algorithm> using namespace std; int st,en,n; int f[502][10004],w[10004],v[10004]; int main(){ int t; scanf("%d",&t); while(t--){ scanf("%d%d",&st,&en); int V=en-st; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d%d",&v[i],&w[i]); memset(f,0x3f3f3f3f,sizeof(f)); for(int i=1;i<=n;i++){ f[i][0]=0; for(int j=1;j<=V;j++){ if(j<w[i]) f[i][j]=f[i-1][j]; else f[i][j]=min(f[i-1][j],f[i][j-w[i]]+v[i]); } } if(f[n][V]>=0x3f3f3f3f) printf("This is impossible.\n"); else printf("The minimum amount of money in the piggy-bank is %d.\n",f[n][V]); } return 0; } /********************************************************** 完全背包问题,物品一定可以装满背包。 有 n 件物品,每件物品有 w[i] 的花费,v[i] 的价值,每件物品可以选择 无数件,求容量为 V 的背包的最大(最小)价值, 我觉得完全背包是背包里面最简单的一种背包,f[i][j]表示前 i 个物品价值 为 j 时的最大(最小)价值,对于当前的第 i 个物品可以选择0~x|x*w[i]<=j 件,可以用三重循环来做 for i:1~n for j:1~V for k 0~x|x*w[i]<=j f[i][j]=max{f[i-1][j-k*w[i]]+v[i]} 优化过之后就是去掉了k的那一层循环,意思就是,f[i][j-k*w[i]]+k*v[i] 这个状态可以由f[i][j-(k-1)*w[i]]+(k-1)*v[i]转移过来,而最终的又可以 由f[i-1][j]转移过来,也就是说,对于第 i 件物品选择 k 件时的最大(最 小)价值可以由选择 k-1 件第 i 件物品时的价值 +v[i]得到。 至于空间复杂度,%>_<% 先这样吧, 那,就着这样吧。 ********************************************************************* 3 10 110 2 1 1 30 50 10 110 2 1 1 50 30 1 6 2 10 3 20 4 **********************************************************************
分类:
谨小慎微,善始善终
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)
· 程序员常用高效实用工具推荐,办公效率提升利器!