HLOJ1366 Candy Box 动态规划(0-1背包改)
题目描述:
给出N个盒子(N<=100),每个盒子有一定数量的糖果(每个盒子的糖果数<=100),现在有q次查询,每次查询给出两个数k,m,问的是,如果从N个盒子中最多打开k个盒子(意思是打开1~k个盒子)能否使得糖果的总数恰好等于m,如果可以则输出Yes,否则输出No
题目分析:
对于普通的0-1背包我们经过优化之后用一个一维数组dp[j]表示的是前i个物品,容量为j时的可以获得的最大的价值,但是本题有些不同的是,我们求的dp[j]表示的是前i个盒子,容量恰好为j时,可以选择打开的盒子的最少个数(此处有一个不同之处在于,对于普通的0-1背包容量为j时的最大值可以是没有放满j的容量的,但是本题题意要求的是恰好放满m的容量,所以在推理动态转移方程的时候,如果dp[j-w[i]]的种数为0,则恰好为j就是不可能的)
代码:
#include<iostream>
#include<algorithm>
#include<cmath>
#include<string.h>
using namespace std; int dp[];
int w[]; int main(){
int cnt = ;
int n, q;
while(scanf("%d%d", &n, &q) != EOF){
printf("Case #%d:\n", cnt++);
int sum = ;
for(int i = ; i <= n; i++){
scanf("%d", &w[i]);
sum += w[i];
}
memset(dp, , sizeof(dp));
dp[w[]] = ; //对于第一个盒子而言,只有dp[w[1]] = 1这一种情况
for(int i = ; i <= n; i++){ //从第二个盒子开始遍历
for(int j = sum; j >= w[i]; j--){
if(dp[j] == ){ //如果当前为0且前驱状态不为0,则构成当前容量可以打开的最少的盒子数自然是前一种的最少数+1
if(dp[j-w[i]] != ){
dp[j] = dp[j-w[i]] + ;
}
}else{ //如果当前状态不是0且前驱的状态也不为0 则取前驱+1,和当前状态的最小值
if(dp[j-w[i]] != ){
dp[j] = min(dp[j], dp[j-w[i]] + );
}
}
}
dp[w[i]] = ; //每次dp[w[i]]都是为1 这里需要补上,因为上述的动态转移方程当j==w[i]时是不处理的
}
int k, m;
for(int i = ; i <= q; i++){
scanf("%d%d", &k, &m);
if(dp[m] <= k && dp[m] != ) printf("Yes\n");
else printf("No\n");
}
}
return ;
}
HLOJ1366 Candy Box 动态规划(0-1背包改)的更多相关文章
- poj1417 带权并查集+0/1背包
题意:有一个岛上住着一些神和魔,并且已知神和魔的数量,现在已知神总是说真话,魔总是说假话,有 n 个询问,问某个神或魔(身份未知),问题是问某个是神还是魔,根据他们的回答,问是否能够确定哪些是神哪些是 ...
- P1417 烹调方案 (0/1背包+贪心)
题目背景 由于你的帮助,火星只遭受了最小的损失.但gw懒得重建家园了,就造了一艘飞船飞向遥远的earth星.不过飞船飞到一半,gw发现了一个很严重的问题:肚子饿了~ gw还是会做饭的,于是拿出了储藏的 ...
- 洛谷 P1064 金明的预算方案 (有依赖的0/1背包)
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NN元钱就行”. ...
- POJ 1636 Prison rearrangement DFS+0/1背包
题目链接: id=1636">POJ 1636 Prison rearrangement Prison rearrangement Time Limit: 3000MS Memor ...
- POJ 1745 【0/1 背包】
题目链接:http://poj.org/problem?id=1745 Divisibility Time Limit: 1000MS Memory Limit: 10000K Total Sub ...
- virtual box 6.0 扩容原有磁盘空间 ubuntu18.04
virtual box 6.0 扩容原有磁盘空间 ubuntu18.04 1虚拟介质管理 1.1点击菜单 1.2 修改磁罗容量大小(需要关闭虚拟机),点击应用 2使用ubuntu安装镜像将新加容量添加 ...
- 浙大PAT CCCC L3-001 凑零钱 ( 0/1背包 && 路径记录 )
题目链接 分析 : 就是一个 0/1 背包,但是需要记录具体状态的转移情况 这个可以想象成一个状态转移图,然后实际就是记录路径 将状态看成点然后转移看成边,最后输出字典序最小的路径 这里有一个很巧妙的 ...
- 牛客网 TaoTao要吃鸡 ( 0/1背包变形 )
题意 : 题目链接 分析 : 如果没有 BUG (即 h == 0 的时候)就是一个普通的 0 / 1 背包 需要讨论一下 h != 0 的情况 此时有就相当于有物品是有特权的 而且背包装有特权的物 ...
- 【Python】0/1背包、动态规划
0/1背包问题:在能承受一定重量的背包中,放入重量不同,价值不同的几件物品,怎样放能让背包中物品的价值最大? 比如,有三件物品重量w,价值v分别是 w=[5,3,2] v=[9,7,8] 包的容量是5 ...
随机推荐
- ES5.1下的作用域链
作用域链(ES5.1规格视角) javascript作用域类型 javascript采用的是词法作用域(静态作用域) 与之相对的是动态作用域,以下的例子可以很好地说明 let a = 3 functi ...
- 8.22 NOIP模拟测试29(B) 爬山+学数数+七十和十七
T1 爬山 二分最高高度,$O(1)$判断是否可行. #include<iostream> #include<cstdio> #define ll long long usin ...
- [LeetCode] 212. Word Search II 词语搜索之二
Given a 2D board and a list of words from the dictionary, find all words in the board. Each word mus ...
- JavaScript 系列--JavaScript一些奇淫技巧的实现方法(三)数字取整,数组求和
一.前言 简短的sleep函数,获取时间戳:https://www.mwcxs.top/page/746.html 数字格式化 1234567890 --> 1,234,567,890:argr ...
- Visual Studio 2019 for Mac 离线更新方法
当你打开Visual Studio 2019 for Mac检查更新时,如果下载更新包很慢,可以尝试如下操作: 打开Finder(访达),找到~/Library/Caches/VisualStudio ...
- [BAT脚本] 1、BAT脚本FOR循环操作文件和命令返回实例
Wednesday, 31. October 2018 08:18PM - beautifulzzzz 一.需求 需要在windows上实现一个bat脚本解析json,将json转换为自己想要的key ...
- golang strings常用函数
package main import ( "fmt" "strings" ) func main() { s1 := " aBc" s2 ...
- bash: telnet: command not found (Linux安装telnet)
问题描述: centos 系统没有 telnet 命令 bash: telnet: command not found 1.安装telnet服务 (3个) yum install xinetd tel ...
- HTML+css基础 p段落标签 a 超链接标签 Src和href有什么区别和关联? target属性 Meta标签
p段落标签: <p></p> 1.他是唯一一个可以不写结束标签的双标签. a 超链接标签: 从一个页面链接到另一个页面.靠的是href属性. Src和href有什么区别和关联 ...
- 【spring】【spring boot】获取系统根路径,根目录,用于存储临时生成的文件在服务器上
今日份代码: private static final String UPLOAD_TEMP_FILE_NAME = "测试商品数据.xlsx"; /** * 获取临时文件路径 * ...