题目链接: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背包的更多相关文章

  1. NYOJ:题目860 又见01背包

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=860 方法一:不用滚动数组(方法二为用滚动数组,为方法一的简化) 动态规划分析:最少要拿总 ...

  2. [NYOJ 860] 又见01背包

    又见01背包 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述     有n个重量和价值分别为wi 和 vi 的 物品,从这些物品中选择总重量不超过 W  的物品,求所 ...

  3. NYIST 860 又见01背包

    又见01背包时间限制:1000 ms | 内存限制:65535 KB难度:3 描述 有n个重量和价值分别为wi 和 vi 的 物品,从这些物品中选择总重量不超过 W 的物品,求所有挑选方案中物品价值总 ...

  4. nyoj860 又见01背包(背包变形)

    题目860 pid=860" style="text-decoration:none; color:rgb(55,119,188)">题目信息 执行结果 本题排行 ...

  5. NYOJ--860 又见01背包(01背包)

    题目http://acm.nyist.net/JudgeOnline/problem.php?pid=860 分析:题目和普通的01背包问题一样,但是唯一不同的是数据的特殊性. 如果10^9根本就开辟 ...

  6. HDU 2639 骨头收集者 II【01背包 】+【第K优决策】

    题目链接:https://vjudge.net/contest/103424#problem/H 题目大意:与01背包模板题类似,只不过要我们求第K个最大的总价值. 解题分析: 其基本思想是将每个状态 ...

  7. hdu2126 类01背包(三维数组的二维空间优化)

    题目描述: 对于给出的n个物品,每个物品有一个价格p[i],你有m元钱,求最多能买的物品个数,以及有多少种不同的方案 题目分析: 类似01背包的题目,一般的01背包问题我们遇到的是求n个物品,有m的容 ...

  8. Course Selection System ZOJ - 3956 01背包+思维

    Course Selection System ZOJ - 3956 这个题目居然是一个01背包,我觉得好难想啊,根本就没有想到. 这个题目把题目给的转化为  ans = a*a-a*b-b*b 这个 ...

  9. 【志银】NYOJ《题目524》A-B Problem

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=860 My思路: 先用两个字符串储存这两个实数,然后再用另外两个字符串储存去掉符号和前后多 ...

随机推荐

  1. BOM编程

    1 BOM编程 1.1 入门 BOM就是浏览器对象模型编程,通过javascript引擎提供的四个浏览器对象,操作浏览器,这叫BOM编程 1.2 window对象(重点) window代表的是一个窗口 ...

  2. java导入、导出

    一.介绍 当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统.银行系统).或者是:我们已经习惯用Excel打印.这样在我们实际 ...

  3. JT796、JT808、JT809、JT1076、JT1077、JT1078部标平台过检道路运输车辆卫星定位系统企业视频监控平台检测登记表

    道路运输车辆卫星定位系统企业视频监控平台检测登记表的具体格式如下: 报名检测需要以下材料: 0检测报名须知.doc   点击下载 1检测意向单.doc   点击下载 2-1道路运输车辆卫星定位系统企业 ...

  4. C++编程经验总结1

    面向对象的精髓: 主函数其实就是对于类的元素和动作的重新组合来进行一项活动. 一个思想概念:程设是清楚的,完美的. 数学是清楚的,是完美的. 物理是有趣的,尤其是量子物理 生物是清楚的,尤其是基因 外 ...

  5. ES6初识-Symbol

    Symbol的概念 变量是独一无二的 let a1=Symbol(); let a2=Symbol(); a1和a2严格意义不相等 let a3=Symbol.for('a3'); let a4=Sy ...

  6. django+xadmin在线教育平台(十五)

    7-4 课程机构列表页数据展示2 前去html中进行数据填充   mark 可以看到所有城市是通过a标签,当前选中城市为active.   mark 之后把下面的写死的城市删除掉.   mark 这时 ...

  7. TCL之表达式

  8. python之获取微信好友列表并保存文档中

    代码如下 from wxpy import * from pprint import pprint #登录微信 bot = Bot() my_friend = bot.friends() f = op ...

  9. 守护进程,进程安全,IPC进程间通讯,生产者消费者模型

    1.守护进程(了解)2.进程安全(*****) 互斥锁 抢票案例3.IPC进程间通讯 manager queue(*****)4.生产者消费者模型 守护进程 指的也是一个进程,可以守护着另一个进程 一 ...

  10. SGU 169 numbers 数学

    169.Numbers Let us call P(n) - the product of all digits of number n (in decimal notation). For exam ...