hdu 2844 多重背包模板题 01背包、完全背包、多重背包模板
2016-02-19 16:51
357 查看
<p><span style="font-family: Arial, Helvetica, sans-serif;">分析:将多重背包转化为01背包思想,优化复杂度为O(Vsum(logM));</span></p><p></p><p>AC代码:</p>
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int dp[100005],c[105],v[105]; int m; void CompletePack(int c,int w) { int i; for(i=c;i<=m;i++) dp[i]=max(dp[i],dp[i-c]+w); } void ZeroOnePack(int c,int w) { int i; for(i=m;i>=c;i--) dp[i]=max(dp[i],dp[i-c]+w); } void MultiplePack(int c,int w,int amount) { if(c*amount>=m) { CompletePack(c,w); return; } int k; k=1; while(k<amount) { ZeroOnePack(k*c,k*w); amount=amount-k; k=2*k; } ZeroOnePack(c*amount,w*amount); } int main() { int n; int flag[100005]; while(~scanf("%d%d",&n,&m)&&(n||m)) { int i; memset(dp,0,sizeof(dp)); memset(flag,0,sizeof(flag)); for(i=1;i<=n;i++) scanf("%d",&v[i]); for(i=1;i<=n;i++) scanf("%d",&c[i]); for(i=1;i<=n;i++) { MultiplePack(v[i],v[i],c[i]); } int ans=0; for(i=1;i<=m;i++) if(dp[i]) flag[dp[i]]=1; for(i=1;i<=m;i++) if(flag[i]) ans++; printf("%d\n",ans); } return 0; }
相关文章推荐
- android音频底层调试-基于tinyalsa
- windows API与C#的数据类型对应关系表
- 调出相册或者相机、单例
- 如何对Redis设置密码,提高安全性
- JPA简介
- 欢迎使用CSDN-markdown编辑器
- 围棋
- 3D Touch集成过程整理
- Springmvc 注解 伪静态(urlrewrite) 配置
- css之通配符选择器
- enumerateObjectsUsingBlock 、for 、for(... in ...) 的区别 & 性能测试
- 去掉xcode编译warning:ld: warning: directory not found for option:xxxxxx 的方法
- Boost 编译
- Java UDP 简单实例
- MFC对话框中临时屏蔽掉一个控件
- 如何简单地测算系统吞吐量
- leetcode笔记--Reorder List
- Pod基本命令
- WinCE系统下应用崩溃原因的分析方法
- Android访问网络