BZOJ 1190 梦幻岛宝珠
2017-03-15 15:42
447 查看
二进制分组背包。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,w; long long f[45][1050],x,y; int main() { while (scanf("%d%d",&n,&w)==2) { memset(f,0,sizeof(f)); if (n==-1 && w==-1) break; for (int i=1;i<=n;i++) { scanf("%lld%lld",&x,&y); int a,b=0; while (!(x&1)) {x>>=1;b++;} a=x; for (int j=1000;j>=a;j--) f[b][j]=max(f[b][j],f[b][j-a]+y); } for (int i=0;i<=30;i++) for (int j=1;j<=1000;j++) f[i][j]=max(f[i][j],f[i][j-1]); long long ans=0; for (int i=1;i<=1000;i++) ans=max(ans,f[0][i]); for (int i=1;i<=30 && (1<<i)<=w;i++) for (int j=min(1000,w>>i);j>=0;j--) for (int k=0;k<=j;k++) { f[i][j]=max(f[i][j],f[i][j-k]+f[i-1][min(2*k+(((w>>(i-1))&1)>0),1000)]); ans=max(ans,f[i][j]); } printf("%lld\n",ans); } return 0; }
相关文章推荐
- [DP]BZOJ 1190——[HNOI2007]梦幻岛宝珠 动态规划]
- 1190: [HNOI2007]梦幻岛宝珠 - BZOJ
- [bzoj1190][HNOI2007]梦幻岛宝珠 分组背包
- BZOJ 1190: [HNOI2007]梦幻岛宝珠
- BZOJ 1190 HNOI2007 梦幻岛宝珠 动态规划
- BZOJ 1190 梦幻岛宝珠 [01背包][二进制优化]
- [数位DP] BZOJ1190. [HNOI2007]梦幻岛宝珠
- bzoj1190 梦幻岛宝珠 动态规划
- 【bzoj1190】[HNOI2007]梦幻岛宝珠 分层背包dp
- BZOJ 1190 [HNOI2007]梦幻岛宝珠
- bzoj1190 [HNOI2007]梦幻岛宝珠 ( 二进制分组优化背包DP)
- 【BZOJ1190】[HNOI2007]梦幻岛宝珠 分层背包DP
- BZOJ 1190: [HNOI2007]梦幻岛宝珠 背包DP
- [BZOJ 1190][HNOI2007]梦幻岛宝珠
- 1190: [HNOI2007]梦幻岛宝珠
- 分层背包 [HNOI2007]梦幻岛宝珠
- 【基础算法】铲雪车问题(BZOJ1190)
- bzoj1190
- 题解 P3188 【[HNOI2007]梦幻岛宝珠】 DP
- 【bzoj1190】[HNOI2007]梦幻岛宝珠 分层背包dp