HDU 5543 Pick The Sticks:01背包变种
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5543
题意:
给你N个金条和一张长度为L的桌子。每个金条长度为a[i],价值为w[i]。金条只能在桌子上横着摆一排,并且只要金条的重心(中心)在桌子上,就可以放。问你在桌子上能够摆的金条的最大总价值。
题解:
首先表示状态:
考虑到第i个金条,在这之前已经占用了j的长度,在k个端点摆了金条。即:dp[i][j][k]
如何转移(逆推):
对于第i个金条,有三种决策:摆在桌子中央、摆在桌子端点处、不摆。
(1)摆在中央:dp[i][j][k] = max(dp[i][j][k], dp[i-1][j-a[i]][k])
(2)摆在端点:dp[i][j][k] = max(dp[i][j][k], dp[i-1][j-a[i]/2][k-1])
(3)不摆: dp[i][j][k] = max(dp[i][j][k], dp[i-1][j][k])
求dp:枚举i,j,k即可。
注:(1)由于空间限制,dp[i][j][k]去掉第一维[i],枚举j时从大到小枚举。
(2)由于计算金条长度的一半时会出现浮点数,所以在读入时就将所有a[i]*=2,并且L*=2。
AC Code:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define MAX_N 1005
#define MAX_L 4005
#define MAX_K 5 using namespace std; int n,l,t;
long long ans;
long long a[MAX_N];
long long w[MAX_N];
long long dp[MAX_L][MAX_K]; void read()
{
ans=;
cin>>n>>l;
l*=;
for(int i=;i<n;i++)
{
cin>>a[i]>>w[i];
a[i]*=;
ans=max(ans,w[i]);
}
} void solve()
{
memset(dp,,sizeof(dp));
for(int i=;i<n;i++)
{
for(int j=l;j>=a[i]/;j--)
{
for(int k=;k<;k++)
{
if(j-a[i]>=) dp[j][k]=max(dp[j][k],dp[j-a[i]][k]+w[i]);
if(k->=) dp[j][k]=max(dp[j][k],dp[j-a[i]/][k-]+w[i]);
ans=max(ans,dp[j][k]);
}
}
}
} void print()
{
cout<<ans<<endl;
} int main()
{
cin>>t;
for(int cas=;cas<=t;cas++)
{
cout<<"Case #"<<cas<<": ";
read();
solve();
print();
}
}
HDU 5543 Pick The Sticks:01背包变种的更多相关文章
- uestc oj 1218 Pick The Sticks (01背包变形)
题目链接:http://acm.uestc.edu.cn/#/problem/show/1218 给出n根木棒的长度和价值,最多可以装在一个长 l 的容器中,相邻木棒之间不允许重叠,且两边上的木棒,可 ...
- hdu 5543 Pick The Sticks(动态规划)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5543 题意:给你一根长为m的长木板和一些小木棒,每一根小木棒有它的长度和价值,这些小木棒要放在长木板上 ...
- HDU 5543 Pick The Sticks
背包变形.与普通的背包问题不同的是:允许有两个物品可以花费减半. 因此加一维即可,dp[i][j][k]表示前i个物品,有j个花费减半了,总花费为k的情况下的最优解. #pragma comment( ...
- HDU 5234 Happy birthday --- 三维01背包
HDU 5234 题目大意:给定n,m,k,以及n*m(n行m列)个数,k为背包容量,从(1,1)开始只能往下走或往右走,求到达(m,n)时能获得的最大价值 解题思路:dp[i][j][k]表示在位置 ...
- HDOJ(HDU).3466 Dividing coins ( DP 01背包 无后效性的理解)
HDOJ(HDU).3466 Dividing coins ( DP 01背包 无后效性的理解) 题意分析 要先排序,在做01背包,否则不满足无后效性,为什么呢? 等我理解了再补上. 代码总览 #in ...
- HDOJ(HDU).2546 饭卡(DP 01背包)
HDOJ(HDU).2546 饭卡(DP 01背包) 题意分析 首先要对钱数小于5的时候特别处理,直接输出0.若钱数大于5,所有菜按价格排序,背包容量为钱数-5,对除去价格最贵的所有菜做01背包.因为 ...
- HDOJ(HDU).2602 Bone Collector (DP 01背包)
HDOJ(HDU).2602 Bone Collector (DP 01背包) 题意分析 01背包的裸题 #include <iostream> #include <cstdio&g ...
- HDU 1864 最大报销额 0-1背包
HDU 1864 最大报销额 0-1背包 题意 现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具(B类).差旅(C类),要求每张发票的总额不得超过1000元,每张发票上, ...
- 01背包变种 第k解问题 hdu 2639
先说说普通01包的状态问题吧 普通的01背包,在状态转移的过程中为了求出最优解,一定是遍历了所有的情况 然后再求的最优解.那么对于第k最优解问题,我们只需要再加一个维度,用来记录每一个状态k优解的状态 ...
随机推荐
- less中的变量
[less中的变量]1.声明变量:@变量名:变量值:使用变量:@变量名:[less中变量的类型]1.数字 数字px2.字符串:无引号字符串 red blue 有引号 "haha" ...
- 2017CCPC中南地区赛 H题(最长路)
题目地址:202.197.224.59/OnlineJudge2/ 来自湘潭大学OJ. 这里用到了一个树的直径(树中的最长边)的结论:当你找到一棵树的最长边后,这个树中所有点的最长边必定和这条边的两个 ...
- net::ERR_CONNCTION_ABORTED与http post request header is too large 错误
开始浏览器报(net::ERR_CONNCTION_ABORTED)然后就一直找这个错误是怎么引起的,找了一圈也没有找到答案. 后来看了一下后台发出后台错http post request heade ...
- 【转】SQL多条件模糊查询解决方案-存储过程
前言: 算法的基本特性在前几篇博客中已经做了详细的说明,经过不断的改进优化,到归仓的时候了,也就是说,该算法告一段落,不再更新. 作为最终的解决方案,简要的总结一下算法特性,以方便读者参阅. l ...
- 致命错误:mysql/cli 目录 #include "mysql/client_plugin.h"
居然说没有mysql.h这个文件,可是我确实安装了mysql了啊....... 原来是缺少libmysqlclient-dev,OK安装就是了 ubuntu下 : audo apt-get in ...
- vue子父组件通信
之前在用vue写子父组件通信的时候,老是遇到问题!!! 子组件传值给父组件: 子组件:通过emit方法给父组件传值,这里的upparent是父组件要定义的方法 模板: <div v-on:cli ...
- SpringEL 表达式错误记录
原因暂时未知....
- javascript 实现 对XML文件 2级/3级联动操作
js代码 //实现对xml文档的读取:function loadXMLDoc(dname) { try // Internet Explorer { xmlDoc = new ActiveXObjec ...
- js获取鼠标点击的对象,点击另一个按钮删除该对象
作为js的一名新手,对于所谓的event的了解并不是太多,仅仅根据视频教学中的例子模仿着,写了诸如: function funcname(e) { e=window.event||event };的函 ...
- centos7 安装elasticsearch
[root@localhost local]# tar xzvf elasticsearch-2.3.5.tar.gz [root@localhost elasticsearch-2.3.5]# bi ...