hdu-5543-Pick The Sticks
来源:互联网 发布:百度网络硬盘登陆 编辑:程序博客网 时间:2024/06/05 08:43
Pick The Sticks(题目链接)
这道题其实是01背包的变形。对,掐头去尾就是一个01背包
所以这道题的处理方法其实和01背包很像!
但是难点还在。就是如何处理头和尾
我第一次是列举出所有的头,特殊处理
wa了。自己还是没有理解背包。犯了同样的错误
详情请点击链接
对于头和尾,只有两个特殊情况,那么和上面链接的题目一样
特殊处理,01背包单独跑
对于每一个物品,他都可能是头和尾,那么我把他当头和尾(即用的时候用长度的一半)
来跑一边01背包。将所有情况找一下最优解
这样就ok了
dp用了三层,第一层的dp记录的是假设金条不可以出界的情况(即完完全全的01背包)
下面的第二层dp记录的是用当前的物品当做头或者尾的情况(如果不能做头和尾,那么保留原数)
第三层dp记录了有两个物品当头或者尾的情况(这两个物品)
三次背包同时跑保证了一个物品不会被两次当做头或者尾。如果分开跑
第二层跑完了,即已经加上了一个头或尾,第三层dp就会多加
而且跑第三层dp需要第二层dp的值!而我们先跑了第二层dp就会把值覆盖
下面代码
#include<stdio.h>#include<algorithm>#include<iostream>#include<string.h>#define ll long longusing namespace std;int u[10005];ll v[10005];ll dp[5005][5];int main(){ int t,step=1; scanf("%d",&t); while(t--) { int n,L; scanf("%d%d",&n,&L); //L*=2; //为了防止出现浮点数,桌长和金条长全部翻倍 memset(dp,0,sizeof(dp)); ll ans=0; for(int i=1; i<=n; i++) { scanf("%d%lld",&u[i],&v[i]); //u[i]=2*u[i]; if(v[i]>ans) ans=v[i]; //找出最大值,因为最少可以放一个 } for(int i=1; i<=n; i++) //dp[i][j]表示桌长为i时最多有j个只放一半的物品的最大值 { for(int j=L; j>=0; j--) { for(int l=0; l<=2; l++) //跑三遍01背包(注意,这三次背包是同时跑的) { if(j>=u[i]) dp[j][l]=max(dp[j][l],dp[j-u[i]][l]+v[i]); if(l&&j>=u[i]/2) dp[j][l]=max(dp[j][l],dp[j-u[i]/2][l-1]+v[i]); } }// for(int i=0;i<=2;i++)// {// for(int j=1;j<=L;j++)// {// printf("%d ",dp[j][i]);// }// printf("\n");// }// printf("\n"); } for(int i=0;i<=L;i++) //找出最优解 { for(int j=0;j<=2;j++) { if(dp[i][j]>ans) ans=dp[i][j]; } } printf("Case #%d: %lld\n",step++,ans); }}
1 0
- HDU 5543 Pick The Sticks
- hdu 5543 Pick The Sticks
- HDU 5543 Pick The Sticks
- hdu-5543-Pick The Sticks
- Pick The Sticks HDU
- HDU 5543 Pick The Sticks(DP)
- hdu 5543 Pick The Sticks 【01背包】
- HDU 5543 Pick The Sticks【三维dp】
- HDU 5543 Pick The Sticks 背包变形 ccpc
- hdu 5543 Pick The Sticks(01背包)
- HDU 5543 Pick The Sticks (DP 01背包)
- HDU 5543 Pick The Sticks(0-1背包)
- hdu 5543 Pick The Sticks(01背包)
- HDU 5543 Pick The Sticks【0-1背包】
- hdu oj Pick The Sticks(01背包)
- HDU5543-Pick The Sticks
- Pick The Sticks UESTC
- UESTC 1218 Pick The Sticks
- Android studio断点调试技巧
- Redis系列(二)——数据持久化介绍与配置
- freeBSD pkg 安装问题
- wep前端工程师要掌握的基础知识和技能
- Java集合之Vector
- hdu-5543-Pick The Sticks
- split方法拆分字符串
- 安卓引导页划动中页面消失、异常退出问题
- 欢迎使用CSDN-markdown编辑器
- jQuery中的DOM操作
- 第四章 面向对象(下)
- leetcode 10 Regular Expression Matching(Dynamic Programming)
- Spring源码学习--自定义标签
- 第六讲:index$watch.html