NYOJ:题目860 又见01背包
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=860

方法一:不用滚动数组(方法二为用滚动数组,为方法一的简化)
动态规划分析:最少要拿总价值一定,求所拿的最小质量(根据"最大能拿总重量一定,求能拿的最大价值"原理推导)
(PS:为了更好的理解,先不用滚动数组,直接开了两个数组,第一个数组用来储存最少要拿总价值为j时所拿的最小质量,第二个数组用来储存第一个的改变前状态)
例:
最大总质量sw = 5,物品数量n = 4;
1 2 3 4 <-第i个物品
w[] = {2, 1, 3, 2} //重量
v[] = {3, 2, 4, 2} //价值
最大总质量sw = 5,最大总价值sv = 11,物品数量n = 4;
分析打表结果如下:

#include<iostream>
using namespace std;
int main() {
int n, sw, sv, v[], w[], m[], b[]; //n为物品数量,sw为总重量,sv为总价值
while(cin >> n >> sw) { //m[j]为最少要拿总价值为j时所拿的最小质量
sv = ; //b[i]用来储存m[i]的上一个状态,如果用滚动数组方法就可以去掉b[]数组
for(int i = ; i <= n; i++) {
cin >> w[i] >> v[i];
sv += v[i];
}
for(int j = ; j <= ; j++) {
m[j] = ; //初始化为题目范围内最大值
b[j] = m[j];
}
m[] = b[] = ;
for(int i = ; i <= n; i++) {
for(int j = ; j <= sv; j++) {
if(j >= v[i]) m[j] = min(b[j], b[j-v[i]]+w[i]);
else m[j] = min(b[j], w[i]);
}
for(int j = ; j <= sv; j++) {
b[j] = m[j];
//b[j] > 1000000000 ? cout << "+ " : cout << b[j] << " "; //去掉这两行注释可打表结果
}
//cout << endl;
}
int big = ; //从价值为1开始找所有能拿到的价值
while(big <= sv && b[big] <= sw) big++;
cout << big- << endl;
}
}
代码实现(点击展开)
方法二:用滚动数组(方法一的简化)
原理:利用方法一的表格,按照价值j倒序计算表中的值
#include<iostream>
using namespace std;
int main() {
int n, sw, sv, v[], w[], m[]; //n为物品数量,sw为总重量,sv为总价值
while(cin >> n >> sw) { //m[j]为最少要拿总价值为j时所拿的最小质量
sv = ;
for(int i = ; i <= n; i++) { cin >> w[i] >> v[i]; sv += v[i]; }
for(int j = ; j <= ; j++) m[j] = ; //初始化为题目范围内最大值
for(int i = ; i <= n; i++) {
for(int j = sv; j >= ; j--) {
if(j >= v[i]) m[j] = min(m[j], m[j-v[i]]+w[i]);
else m[j] = min(m[j], w[i]);
//m[j] > 1000000000 ? cout << "+ " : cout << m[j] << " "; //去掉这两行注释可打表结果
}
//cout << endl;
}
int big = ; //从价值为1开始找所有能拿到的价值
while(big <= sv && m[big] <= sw) big++;
cout << big- << endl;
}
}
代码实现(点击展开)
开始写于:2016.5.20 ----志银
NYOJ:题目860 又见01背包的更多相关文章
- [NYOJ 860] 又见01背包
又见01背包 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 有n个重量和价值分别为wi 和 vi 的 物品,从这些物品中选择总重量不超过 W 的物品,求所 ...
- NYIST 860 又见01背包
又见01背包时间限制:1000 ms | 内存限制:65535 KB难度:3 描述 有n个重量和价值分别为wi 和 vi 的 物品,从这些物品中选择总重量不超过 W 的物品,求所有挑选方案中物品价值总 ...
- nyoj860 又见01背包(背包变形)
题目860 pid=860" style="text-decoration:none; color:rgb(55,119,188)">题目信息 执行结果 本题排行 ...
- 【志银】NYOJ《题目860》又见01背包
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=860 方法一:不用滚动数组(方法二为用滚动数组,为方法一的简化) 动态规划分析:最少要拿总 ...
- NYOJ--860 又见01背包(01背包)
题目http://acm.nyist.net/JudgeOnline/problem.php?pid=860 分析:题目和普通的01背包问题一样,但是唯一不同的是数据的特殊性. 如果10^9根本就开辟 ...
- HDU 2639 骨头收集者 II【01背包 】+【第K优决策】
题目链接:https://vjudge.net/contest/103424#problem/H 题目大意:与01背包模板题类似,只不过要我们求第K个最大的总价值. 解题分析: 其基本思想是将每个状态 ...
- hdu2126 类01背包(三维数组的二维空间优化)
题目描述: 对于给出的n个物品,每个物品有一个价格p[i],你有m元钱,求最多能买的物品个数,以及有多少种不同的方案 题目分析: 类似01背包的题目,一般的01背包问题我们遇到的是求n个物品,有m的容 ...
- Course Selection System ZOJ - 3956 01背包+思维
Course Selection System ZOJ - 3956 这个题目居然是一个01背包,我觉得好难想啊,根本就没有想到. 这个题目把题目给的转化为 ans = a*a-a*b-b*b 这个 ...
- nyoj 203 三国志 dijkstra+01背包
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=203 思路:先求点0到每个点的最短距离,dijkstra算法,然后就是01背包了 我奇怪的 ...
随机推荐
- English Metric Units and Open XML
English Metric Units and Open XML 在Open XML里使用了English Metric Units(EMUs)来作为度量单位.比如 public class Ext ...
- hadoop的dfs工具类一个【原创】
开始没搞定插件问题,就弄了个dsf操作类,后面搞定了插件问题,这玩意也就聊胜于无了,还是丢这里算了. 首先是一个配置,ztool.hadoop.properties hadoop.home.dir=G ...
- Invalid Image Path - No image found at the path referenced under key "CFBundleIconFile": Icon.png
I got the same error when uploading my app. Moving all icon files to the Asset Catalog works if your ...
- CSS基础(七):z-index详解
概念 z-index 属性设置元素的堆叠顺序.拥有更高堆叠顺序的元素总是会处于堆叠顺序较低的元素的前面. 层级关系的比较 1. 对于同级元素,默认(或position:static)情况下文档流后面的 ...
- windows下配置启动多个mysql服务
查找配置做下记录 先安装mysql5.6,安装不在介绍 接下来配置启动另一个mysql服务, 1:先到服务里停止在运行的mysql服务 2:到mysql的安装目录下(默认安装目录在c:\Program ...
- 使用GROUP BY统计记录条数 COUNT(*) DISTINCT
例如这样一个表,我想统计email和passwords都不相同的记录的条数 CREATE TABLE IF NOT EXISTS `test_users` ( `email_id` ) unsigne ...
- NVARCHAR 和VARCHAR区别和使用
1.各自的定义: ► nvarchar(n) : 包含 n 个字符的可变长度 Unicode 字符数据.n 的值必须介于 1 与 4,000 之间.字节的存储大小是 ...
- css3背景颜色渐变
<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content ...
- Java知多少(105)套接字(Socket)
网络应用模式主要有: 主机/终端模式:集中计算,集中管理: 客户机/服务器(Client/Server,简称C/S)模式:分布计算,分布管理: 浏览器/服务器模式:利用Internet跨平台. www ...
- Javascript面向对象之继承
与类的创建篇一样,这里先贴出最终代码,再做详细分析: // 创建一个父类 function SuperType(){ this.company = 'alibaba'; } function SubT ...