博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 3732 Ahui Writes Word
阅读量:6818 次
发布时间:2019-06-26

本文共 1546 字,大约阅读时间需要 5 分钟。

乍一看是01背包,但是100000*10000的复杂度肯定是TLE的,但是(0 ≤ Vi , Ci ≤ 10),所以最多也只有100种物品,转化成多重背包去做。

#include
#include
#include
int N,C,vv,cc;int g[15][15];char s[100];int w[105],c[105],n1[105];int tot;int f[10000+10];int max(int a,int b){ if(a>b) return a; else return b;}void ZeroOnePack(int c, int w){ for (int v = C; v >= c; v--) { f[v] = max(f[v], f[v-c] + w); }}//完全背包void CompletePack(int c, int w){ for (int v = c; v <= C; v++) { f[v] = max(f[v], f[v-c] + w); }}//多重背包,二进制。void MultiplePack(int c, int w, int n1){ if (c * n1 >= C) { CompletePack(c, w); } else { int k = 1; while (k < n1) { ZeroOnePack(k*c, k*w); n1 -= k; k <<= 1; } ZeroOnePack(n1*c, n1*w); }}int main(){ while(~scanf("%d%d",&N,&C)) { memset(g,0,sizeof g); tot=0; for(int i=1;i<=N;i++) { scanf("%s%d%d",s,&vv,&cc); g[vv][cc]++; } for(int i=0;i<=10;i++) { for(int j=0;j<=10;j++) { if(g[i][j]>0) { w[tot]=i; c[tot]=j; n1[tot]=g[i][j]; tot++; } } } memset(f, 0, sizeof(f)); for (int i = 0; i < tot; i++) MultiplePack(c[i], w[i], n1[i]); printf("%d\n", f[C]); } return 0;}

 

转载于:https://www.cnblogs.com/zufezzt/p/4859259.html

你可能感兴趣的文章
如何用腾讯云打造一款微视频APP
查看>>
linux内核中的hook函数详解
查看>>
调用手机GPS实现当前位置定位并展现百度地图上
查看>>
Dota2卡牌游戏《Artifact》登陆Windows/Mac/Linux
查看>>
ruby向数据库用语句插入数据
查看>>
个人--IT业的职业细分
查看>>
“赋能开发者”高峰论坛暨葡萄城联合龙头企业共建模板库正式启动
查看>>
CentOS内核参数优化参考
查看>>
2017年大数据分析领域的六大发展趋势
查看>>
删除Jenkins的构建次数(基于Jmeter的Maven项目)
查看>>
springboot中配置文件配置各种随机数
查看>>
scala----函数和构造函数区别
查看>>
Linux平台的boost安装方法
查看>>
重温关于进程间通信的方式
查看>>
Spring
查看>>
HBase安装配置
查看>>
ssh 连接非22端口服务器的方法:
查看>>
Linux基础入门
查看>>
org.hibernate.hql.internal.ast.QuerySyntaxException: user is not mapped
查看>>
图解排序算法之快速排序-双端探测法
查看>>