hdu 3732 Ahui Writes Word(多重背包的二进制思想优化)
2013-08-16 11:19
465 查看
看到题目的数据我直接就懵了。100000件物品,10000大小的包,1s的时间,处处都是违和感。
首先根据物品的费用和价值将物品分成121中,就是11^2。将题目转化成一个多重背包,转化成多重背包之后还不能直接A掉,因为实际上效率提高地很有限,甚至可以说根本没有提升。这里就要用到背包九讲中提到的二进制思想的优化。优化过后359msAC。
首先根据物品的费用和价值将物品分成121中,就是11^2。将题目转化成一个多重背包,转化成多重背包之后还不能直接A掉,因为实际上效率提高地很有限,甚至可以说根本没有提升。这里就要用到背包九讲中提到的二进制思想的优化。优化过后359msAC。
#include<stdio.h> #include<string.h> #define N 12 int mark ,dp[10005]; int Max(int x,int y) { if(x>y) return x; return y; } int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { int x,y; char s[15]; memset(mark,0,sizeof(mark)); int i,j,k; for(i=1; i<=n; i++) { scanf("%s%d%d",s,&x,&y); mark[x][y]++; } memset(dp,0,sizeof(dp)); for(i=0; i<=10; i++) { for(j=0; j<=10; j++) { int t=1; while(t<mark[i][j]) { for(k=m; k>=t*j; k--) { if(k>=t*j) dp[k]=Max(dp[k-t*j]+t*i,dp[k]); } mark[i][j]-=t; t*=2; } for(k=m; k>=mark[i][j]*j; k--) { if(k>=mark[i][j]*j) dp[k]=Max(dp[k],dp[k-mark[i][j]*j]+mark[i][j]*i); } } } printf("%d\n",dp[m]); } return 0; }
相关文章推荐
- hdu 3732 Ahui Writes Word(多重背包)
- hdu 3732 Ahui Writes Word 【多重背包】、好题
- HDU 3732(Ahui Writes Word)多重背包
- HDU 3732 Ahui Writes Word(多重背包)
- HDU - 3732 Ahui Writes Word(多重背包)
- HDU 3732 Ahui Writes Word(多重背包问题)
- hdu 3732 Ahui Writes Word 多重背包 小心超时
- HDU3732 - Ahui Writes Word - 动态规划之多重背包+二进制优化【经典】
- HDU 3732 Ahui Writes Word(01背包转化为多重背包)
- 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
- HDOJ3732--Ahui Writes Word--多重背包
- HDU-3732 Ahui Writes Word 解题报告
- hdoj 3732 Ahui Writes Word (多重背包)