杭电ACM5543(01背包)
来源:互联网 发布:netsh绑定mac 编辑:程序博客网 时间:2024/06/06 09:19
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5543
题目大意:给一根长度为l的木棒,在木棒上放小棍子,每一根小棍子都有自己的长度和价值,要求保证小棍子的中心一定在木棒上(即可以伸出木棒一半的长度),最后求小棍子的最大价值和。
解题思路:01背包。但不同的是要考虑有几根小棍子悬在木棒的边上,有三种情况:0根、1根、2根,为了防止除以2之后出现小数,将所有的长度都乘上2,利用二维数组dp[i][j]表示当长度为i并且有j根小棍子悬在外面的情况下的总价值。
另外关于这道题目,个人感觉有一位大神的讲解很棒,把地址附上:http://blog.csdn.net/snowy_smile/article/details/49585417
AC代码:
#include <iostream>#include <string.h>using namespace std;typedef long long LL;int main(){ int T; int n,l; LL max; LL len[1005],value[1005]; LL dp[4005][5]; while(cin>>T) { for(int c=1;c<=T;c++) { max=0; memset(dp,0,sizeof(dp)); cin>>n>>l; l*=2; for(int j=0;j<n;j++) { cin>>len[j]>>value[j]; len[j]*=2; max = value[j]>max?value[j]:max; } for(int i=0;i<n;i++) { for(int j=l;j>=len[i]/2;j--) { for(int k=0;k<=2;k++) { if(j>=len[i]) dp[j][k] = (dp[j-len[i]][k]+value[i])>dp[j][k]?dp[j-len[i]][k]+value[i]:dp[j][k]; if(k>0) dp[j][k] = dp[j-len[i]/2][k-1]+value[i]>dp[j][k]?dp[j-len[i]/2][k-1]+value[i]:dp[j][k]; if(max<dp[j][k])max = dp[j][k]; } } } cout<<"Case #"<<c<<": "<<max<<endl; } } return 0;}
之前由于粗心,把for循环中的下标和其他变量搞混了,一直出不来正确答案………………一定要细心啊。
0 0
- 杭电ACM5543(01背包)
- 杭电1171(01背包+完全背包)
- 杭电-2191 (完全背包转换01背包)
- 01背包基础 (杭电2602)
- 杭电 2546 饭卡(01背包)
- 杭电ACM2546(01背包)
- 杭电ACM3466(01背包)
- 杭电2546饭卡(01背包)
- 杭电2955Robberies(01背包)
- 杭电-2546 饭卡(01背包)
- 杭电 2602 01 背包
- 杭电1494---01背包。
- 杭电2602---01背包
- 【杭电2602】01背包
- Bone Collector(杭电2602)(01背包)
- ACM 杭电hdu 2602 Bone Collector(01背包)
- 杭电 1203 I NEED A OFFER!(01背包)
- 杭电 2603 Bone Collector(简单01背包)
- (PHP)正则表达式-忽略空白
- Android知识体系结构
- READING NOTE: Pooling the Convolutional Layers in Deep ConvNets for Action Recognition
- 多个规格、品牌,拼起来 "品牌1和品牌2和",去最后一个连接字符
- 《实用Common Lisp编程》第二章 周而复始: REPL 简介
- 杭电ACM5543(01背包)
- 马踏棋盘图形界面版
- Java学习笔记(注释、对象初始化过程、单例模式)
- 用java语言编写进制转换
- redis 哈希表(Hash)
- hdu 2841
- Redis与Memcached的区别
- HDU 5534 Partial Tree (变形完全背包 好题)
- CodeForces 44H - Phone Number-dp