BIT 1094 Ahui Writes Word
来源:互联网 发布:mac版杀毒软件 编辑:程序博客网 时间:2024/06/09 22:37
题目大意:给你N个字符串(N<100000),以及上限复杂度C(C<100000),每个字符串的价值为v[i],复杂度为c[i],(0<=v[i],c[i]<=10)现在要求在总复杂度和不超过C的情况下得到尽量大的价值。
考察点:DP
思路分析:虽然一眼就知道是个01背包,但是一开始看到N和C的范围傻眼了。。后来再看c[i]跟v[i]的范围,可以发现这其中肯定有大量重复的,所以01背包就转变成多重背包啦
#include<stdio.h>#define max(x,y) (x)>(y)? (x):(y)int c[15][15];int f[10010];char str[21];int t,m,n;void zeroonepack(int x,int y){ int i; for (i=m;i>=x;i--) f[i]=max(f[i],f[i-x]+y);} void complepack(int x,int y){ int i; for (i=x;i<=m;i++) f[i]=max(f[i],f[i-x]+y);}void multiplepack(int x,int y,int z){ if (x*z>=m) complepack(x,y); else { int k=1; while (k<z) { zeroonepack(x*k,y*k); z=z-k; k=k*2; } zeroonepack(z*x,z*y); }} int main(){ int i,j,x,y; while(scanf("%d%d",&t,&m)!=EOF) { memset(f,0,sizeof(f)); memset(c,0,sizeof(c)); n=0; for (i=1;i<=t;i++) { scanf("%s%d%d",str,&x,&y); c[x][y]++; } for (i=0;i<=10;i++) for (j=0;j<=10;j++) if (c[i][j]!=0) multiplepack(j,i,c[i][j]); printf("%d\n",f[m]); } return 0;}
- BIT 1094 Ahui Writes Word
- HDOJ Ahui Writes Word
- Ahui Writes Word
- Ahui Writes Word
- hdu 3732 Ahui Writes Word
- HDU 3732 Ahui Writes Word
- HDU_3732 Ahui Writes Word 背包
- HDOJ 3732 Ahui Writes Word
- HDU 3732 Ahui Writes Word
- hdu 3732 Ahui Writes Word
- hdu 3732 Ahui Writes Word
- HDOJ 3732 Ahui Writes Word
- HDU-3732 Ahui Writes Word
- hdu 3721 Ahui Writes Word 多重背包
- HDU 3732 Ahui Writes Word 解题报告
- HDU-3732 Ahui Writes Word 解题报告
- HDOJ 3732 Ahui Writes Word (多重背包)
- HDOJ3732--Ahui Writes Word--多重背包
- 怎样复制粘贴windows命令行中的内容 .
- ibatis Cache技术介绍
- WIN7系统 每天第一次启动慢的解决办法
- 我的学习方法与时间管理
- 设置浏览器查看源文件打开的默认格式
- BIT 1094 Ahui Writes Word
- 推荐引擎的学习资料
- andriod webview加载地址
- 页面打印科目树, 开始总想用树形控件来做, 但是分页等都有问题。 后来改成直接输出文本。
- win7 64位 配置mysql
- win ce 编译平台时间问题:Error: failed PB timebomb check
- DrawDib函数组的使用
- 值得学习的博客地址
- 云计算开源监控软件