题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5543

题意:往长为L的线段上覆盖线段,要求:要么这些线段都在L的线段上,要么有不超过自身长度一半的部分在线段外面,最多有两条这样的线段(在两头)。

dp(i,j,k)表示前i个线段覆盖在长度为j的线段上,期中有k个线段不完全在这个线段上的最大价值。考虑线段长度的奇偶问题,所以事先把L和其他线段长度乘2,以便操作。所以枚举所有线段,一般情况,就是01背包的问题,dp(i,j,k)=max(dp(i,j,k), dp(i-1,j-w(i),k)+v(i))。当枚举到k不是0的时候,还需要更新两端放的情况:dp(i,j,k)=max(dp(i,j,k),dp(i-1,j-w(i)/2,k-1)+v(i))。直接取w(i)/2是没有关系的,因为我们在这里希望可以贪心地尽可能地少占用当前L上的长度。

还有一个trick:L=1的时候这么搞。这时L当成一个支点,只能放一个。所以要提前处理所有线段的最大价值。

 #include <bits/stdc++.h>
using namespace std; typedef long long LL;
const int maxn = ;
int w[maxn], v[maxn];
int n, L;
LL dp[maxn][];
LL ret; int main() {
freopen("in", "r", stdin);
int T, _ = ;
scanf("%d", &T);
while(T--) {
scanf("%d %d", &n, &L);
memset(dp, , sizeof(dp));
ret = ; L <<= ;
for(int i = ; i <= n; i++) {
scanf("%d %d", &w[i], &v[i]);
w[i] <<= ;
ret = max(ret, (LL)v[i]);
}
for(int i = ; i <= n; i++) {
for(int j = L; j >= w[i]/; j--) {
for(int k = ; k <= ; k++) {
if(j >= w[i]) dp[j][k] = max(dp[j][k], dp[j-w[i]][k]+v[i]);
if(k) dp[j][k] = max(dp[j][k], dp[j-w[i]/][k-]+v[i]);
ret = max(ret, dp[j][k]);
}
}
}
printf("Case #%d: %lld\n", _++, ret);
}
return ;
}

[HDOJ5543]Pick The Sticks(DP,01背包)的更多相关文章

  1. HDU 5543 Pick The Sticks:01背包变种

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5543 题意: 给你N个金条和一张长度为L的桌子.每个金条长度为a[i],价值为w[i].金条只能在桌子 ...

  2. USACO Money Systems Dp 01背包

    一道经典的Dp..01背包 定义dp[i] 为需要构造的数字为i 的所有方法数 一开始的时候是这么想的 for(i = 1; i <= N; ++i){ for(j = 1; j <= V ...

  3. HDOJ(HDU).3466 Dividing coins ( DP 01背包 无后效性的理解)

    HDOJ(HDU).3466 Dividing coins ( DP 01背包 无后效性的理解) 题意分析 要先排序,在做01背包,否则不满足无后效性,为什么呢? 等我理解了再补上. 代码总览 #in ...

  4. POJ.3624 Charm Bracelet(DP 01背包)

    POJ.3624 Charm Bracelet(DP 01背包) 题意分析 裸01背包 代码总览 #include <iostream> #include <cstdio> # ...

  5. HDOJ(HDU).2546 饭卡(DP 01背包)

    HDOJ(HDU).2546 饭卡(DP 01背包) 题意分析 首先要对钱数小于5的时候特别处理,直接输出0.若钱数大于5,所有菜按价格排序,背包容量为钱数-5,对除去价格最贵的所有菜做01背包.因为 ...

  6. HDOJ(HDU).2602 Bone Collector (DP 01背包)

    HDOJ(HDU).2602 Bone Collector (DP 01背包) 题意分析 01背包的裸题 #include <iostream> #include <cstdio&g ...

  7. UVA.10130 SuperSale (DP 01背包)

    UVA.10130 SuperSale (DP 01背包) 题意分析 现在有一家人去超市购物.每个人都有所能携带的重量上限.超市中的每个商品有其相应的价值和重量,并且有规定,每人每种商品最多购买一个. ...

  8. DP(01背包) UESTC 1218 Pick The Sticks (15CCPC C)

    题目传送门 题意:长度为L的金条,将n根金棍尽可能放上去,要求重心在L上,使得价值最大,最多有两条可以长度折半的放上去. 分析:首先长度可能为奇数,先*2.然后除了两条特殊的金棍就是01背包,所以dp ...

  9. 2015南阳CCPC D - Pick The Sticks dp

    D - Pick The Sticks Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 无 Description The story happened lon ...

随机推荐

  1. Windows系统文件受损的修复技巧

    Windows2000/XP系统文件受损的修复技巧 意外重启.安装了不兼容的软件.恶意程序侵扰.误删文件……有太多种可能性会使我们的系统文件受损,而系统文件受损后最直接的表现就是系统不稳定.经常出现错 ...

  2. android 项目学习随笔九(ListView加头布局)

    1.缓冲背景色 <ListView android:id="@+id/lv_list" android:layout_width="match_parent&quo ...

  3. 启用 TStringGrid 的自画功能,并避免重影

    FMX 控件的 TStringGrid 下,有时为了让不同行或不同 Cell 的显示颜色.字体等有各种不同的颜色, 必须采用自画, 即在其 OnDrawColumnCell 事件中写自己的控制代码显示 ...

  4. PL/SQL快捷键

    F8 执行所选中的SQL语句 当光标在sql语句末尾/开头 时 按Shift  Home /Shift  End 选中该语句

  5. Intel Edison 参考链接2

    Edison的breakout板子的引脚: http://iotdk.intel.com/docs/master/mraa/java/edison.html Edison的引脚 http://www. ...

  6. Zabbix中使用ICMP ping来判断主机是否存活的问题

    上一节配置了Simple check,现在来通过Simple check 用ICMP ping来监控充节点运行情况.Zabbix使用fping处理ICMP ping的请求,需要安装fping程序,安装 ...

  7. flex 添加右键链接

    private var myMenu:ContextMenu; private function setViewerVersion():void { var menuItem:ContextMenuI ...

  8. nginx+tomcat负载均衡+动静分离+redis集中管理session

    1.服务器A安装ng,服务器B.C安装tomcat: 2.服务器A建立/data/www目录,用于发布静态文件: 3.ng无动静分离配置: user root root; worker_process ...

  9. grep、egrep、fgrep

    grep: global search regular expression and printing

  10. 用Meta标签控制360浏览器默认极速模式打开自己的网站和正则表达式

    在head标签中添加一行代码: <html><head><meta name="renderer" content="webkit|ie-c ...