题目链接:http://acm.uestc.edu.cn/#/problem/show/1218

给出n根木棒的长度和价值,最多可以装在一个长 l 的容器中,相邻木棒之间不允许重叠,且两边上的木棒,可以伸一半的长度在容器外,求最大价值量

01背包是取和不取。那这里我们可以把容器长度 l x 2,筷子长度 x 2,就变成了最多两个筷子取一次(伸一半在外面),其余的要么取两次,要么不取。

普通01背包,一维dp[i]表示消耗体积i所得到的最大的价值。

那么这里dp[i][k]表示消耗体积i并有k(k <= 2)个在外面所得到的最大的价值。

 1     //#pragma comment(linker, "/STACK:102400000, 102400000")
 2     #include <algorithm>
 3     #include <iostream>
 4     #include <cstdlib>
 5     #include <cstring>
 6     #include <cstdio>
 7     #include <vector>
 8     #include <cmath>
 9     #include <ctime>
10     #include <list>
11     #include <set>
12     #include <map>
13     using namespace std;
14     typedef long long LL;
15     typedef pair <int, int> P;
16     const int N = 4e3 + 5;
17     LL dp[N][5]; //dp[i][k]表示使用i体积有k个木板在露在外面的最大价值
18     int w[N];
19     LL v[N];
20
21     int main()
22     {
23         int t, n, g;
24         scanf("%d", &t);
25         for(int ca = 1; ca <= t; ++ca) {
26             scanf("%d %d", &n, &g);
27             LL ans = 0;
28             for(int i = 1; i <= n; ++i) {
29                 scanf("%d %lld", w + i, v + i);
30                 w[i] <<= 1;
31                 ans = max(ans, v[i]);
32             }
33             g <<= 1;
34             memset(dp, 0, sizeof(dp));
35             for(int i = 1; i <= n; ++i) {
36                 for(int j = g; j >= w[i]/2; --j) { //一维背包类似,说明下面只能取一次
37                     for(int k = 0; k <= 2; ++k) {
38                         if(w[i] <= j) //全放在里面
39                             dp[j][k] = max(dp[j - w[i]][k] + v[i], dp[j][k]);
40                         if(k >= 1) //有一半在外面
41                             dp[j][k] = max(dp[j - w[i]/2][k - 1] + v[i], dp[j][k]);
42                     }
43                 }
44             }
45             for(int i = 0; i <= 2; ++i) {
46                 ans = max(ans, dp[g][i]);
47             }
48             printf("Case #%d: %lld\n", ca, ans);
49         }
50         return 0;
51     }

转载于:https://www.cnblogs.com/Recoder/p/5901730.html

uestc oj 1218 Pick The Sticks (01背包变形)相关推荐

  1. codeforce Gym 101102A Coins (01背包变形)

    01背包变形,注意dp过程的时候就需要取膜,否则会出错. 代码如下: #include<iostream> #include<cstdio> #include<cstri ...

  2. P1734 最大约数和 01背包变形

    传送门 思路:01背包变形题.将i看成重量,i的因子看成价值即可.背包自然是s. /** * From: * Qingdao Agricultural University * Created by ...

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

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

  4. UVA 12563 Jin Ge Jin Qu hao 01背包变形

    基本的01背包,更新的时候保持背包里每一个元素的num最大然后time尽量长 CSDN也支持makedown了试一下 12563 Jin Ge Jin Qu hao (If you smiled wh ...

  5. HDU 2546 饭卡 01背包变形

    饭卡 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

  6. HDU 3466 01背包变形

    给出物品数量N和总钱数M 对于N个物品.每一个物品有其花费p[i], 特殊值q[i],价值v[i] q[i] 表示当手中剩余的钱数大于q[i]时,才干够买这个物品 首先对N个物品进行 q-p的排序,表 ...

  7. poj 2063 Investment(01背包变形)

    http://poj.org/gotoproblem?pid=2063 (1)上限 m 一直上升的 n 次01背包问题,比一般的01背包多了一重循环: (2)本题出现了各种错误:1)刚开始,没注意 m ...

  8. hdu 2184 01背包变形

    转自:http://blog.csdn.net/liuqiyao_01/article/details/8753686 题意:这是又是一道01背包的变体,题目要求选出一些牛,使smartness和fu ...

  9. #1353 : 满减优惠(01背包变形)

    描述 最近天气炎热,小Ho天天宅在家里叫外卖.他常吃的一家餐馆一共有N道菜品,价格分别是A1, A2, ... AN元.并且如果消费总计满X元,还能享受优惠.小Ho是一个不薅羊毛不舒服斯基的人,他希望 ...

最新文章

  1. 嵌入式linux学习笔记1—内存管理MMU之虚拟地址到物理地址的转化
  2. 利用https访问站点(基于linux系统)
  3. webpack4.x配置
  4. 微信小程序红包开发 小程序发红包 开发过程中遇到的坑 微信小程序红包接口的...
  5. Educational Codeforces Round 11C. Hard Process two pointer
  6. 进程守护系统,你懂吗?
  7. C#相关基础知识点总结+基础代码
  8. Dubbo(九)之注解配置
  9. mt4 python神经网络_迈达克软件公司承认Python运算对量化交易的重要性----将Python与Metatrader 5集成一体...
  10. Ubuntu源码安装gcc-10
  11. api wke_好用的wke浏览器代码,兼容chrome
  12. 安装FlexPro和设置FlexPro许可证管理器
  13. C++中局部和全局变量的地址分配
  14. 经典书籍《打开量化投资的黑箱》阅读心得
  15. 高精度地图数据的结构
  16. Source Generator实战
  17. 使用canvas给页面添加文字水印
  18. I.MX6Q(TQIMX6Q/TQE9)学习笔记——新版BSP之u-boot移植
  19. 精通正则表达式学习记录 第二章 入门示例扩展
  20. python 图片中的表格识别

热门文章

  1. 如果你对web前端学习感到迷茫的话请看完本文
  2. 比较ipv6有状态与无状态地址分配工作特点_IPv6环境获取IPV6地址,无状态地址分配,一分钟了解下...
  3. ReactNative入门之android与rn初始化参数的传递
  4. FPGA学习笔记---二进制码、独热码、格雷码分析对比
  5. 面向对象设计——七大原则
  6. DSB2017第一名论文理解: 3D Deep Leaky Noisy-or Network(三)
  7. 图像算法四:【图像增强--频率域】傅里叶变换、快速傅里叶变换、频域滤波、频域低通滤波、频域高通滤波
  8. python与机器学习(二)Numpy / Pandas /矩阵相乘速度对比
  9. 查看tomcat管理信息
  10. 多线程join方法解析