01背包问题程序解析

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
//问题描述:给定 n 种物品和一个容量为 c 的背包,物品 i 的重量是 wi,其价值为 vi.
//问:应该如何选择装入背包的物品,使得装入背包中的物品的总价值最大?

//分析:面对每个物品,我们只有选择拿取或者不拿两种选择,不能选择装入某物品的一部分,也不能装入同一物品多次

//解决方法:声明一个大小为 m[n][c] 的二维数组,m[i][j] 表示在面对第 i 件物品,且背包容量为 j 时所能获得的最大价值,那么我们可以很容易分析得出 m[i][j] 的计算方法,
/*(1).j < w[i]的情况,这时候背包容量不足以放下第 i 件物品,只能选择不拿
m[i][j] = m[i-1][j]
(2).j >= w[i]的情况,这时背包容量可以放下第 i 件物品,我们就要考虑拿这件物品是否能获得更大的价值.
如果拿取,m[i][j] = m[i-1][j - w[i]] + v[i].这里的m[i - 1][j - w[i]]指的是考虑了i-1件物品,背包容量为j - w[i] 时的最大价值,也是相当于为第i件物品腾出了w[i]的空间.
如果不拿,m[i][j] = m[i -1][j],同(1)
究竟是拿还是不拿,自然是比较这两种情况哪种价值最大.
由此可以得到状态转移方程:
if(j >= w[i])
m[i][j] = max(m[i-1][j],m[i-1][j-w[i]] + v[i]);
else
m[i][j] = m[i-1][j];

例子:
价值数组v = {8, 10, 6, 3, 7, 2},

重量数组w = {4, 6, 2, 2, 5, 1},

背包容量C = 12时对应的m[i][j]数组。

*/
const int N = 15;

int main()
{
int v[N] = {0,8,10,6,3,7,2};
int w[N] = {0,4,6,2,2,5,1};

int m[N][N];
int n = 6,c = 12;
memset(m,0,sizeof(m));
for(int i = 1;i <= n;i++){
for(int j = 1;j <= c;j++){
if(j >= w[i]){
m[i][j] = max(m[i-1][j],m[i-1][j-w[i]]+v[i]);
}
else{
m[i][j] = m[i-1][j];
}
}
}
for(int i = 1;i <= n;i++){
for(int j = 1;j <= c;j++){
cout << m[i][j] << " ";
}
cout << endl;
}
return 0;
}
//总的来说,动态规划与分治法有点类似,都是将一个大问题变成小问题然后,然后再通过解决一个一个的子问题,最终达到求解的目的.不过动态规划的效率更高,因为动态规划会把每一个子问题的求解结果记录下来,然后避免重复计算子问题.

原文地址:https://www.cnblogs.com/Chen-Programe/p/8513753.html

时间: 2025-01-17 23:26:04

01背包问题程序解析的相关文章

动态规划的详细解析(01背包问题)

                                  算法分析之动态规划详解 先举个例子01背包问题具体例子:假设现有容量15kg的背包,另外有4个物品,分别为a1,a2,a3, a4.物品a1重量为3kg,价值为4:物品a2重量为4kg,价值为5:物品a3重量为5kg,价值为6, a4重6千克,价值为7.将哪些物品放入背包可使得背包中的总价值最大? 对于这样的问题,如果如上述所涉及的数据比较少的时候,我们通过列举就能算出来,例如,上边的例子的答案是:将a4和a3与a2放入背包中,

ACM 01背包问题1

Description Many years ago , in Teddy’s hometown there was a man who was called “Bone Collector”. This man like to collect varies of bones , such as dog’s , cow’s , also he went to the grave … The bone collector had a big bag with a volume of V ,and

01背包问题

01背包问题详解 题目 有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使价值总和最大. 基本思路 这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放. 用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值.则其状态转移方程便是: f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]} 这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的.所以有必

从01背包问题理解动态规划---初体验

01背包问题具体例子:假设现有容量10kg的背包,另外有3个物品,分别为a1,a2,a3.物品a1重量为3kg,价值为4:物品a2重量为4kg,价值为5:物品a3重量为5kg,价值为6.将哪些物品放入背包可使得背包中的总价值最大? 这个问题有两种解法,动态规划和贪婪算法.本文仅涉及动态规划. 先不套用动态规划的具体定义,试着想,碰见这种题目,怎么解决? 首先想到的,一般是穷举法,一个一个地试,对于数目小的例子适用,如果容量增大,物品增多,这种方法就无用武之地了. 其次,可以先把价值最大的物体放入

《算法导论》读书笔记之第16章 0-1背包问题—动态规划求解

原文:http://www.cnblogs.com/Anker/archive/2013/05/04/3059070.html 1.前言 前段时间忙着搞毕业论文,看书效率不高,导致博客一个多月没有更新了.前段时间真是有些堕落啊,混日子的感觉,很少不爽.今天开始继续看算法导论.今天继续学习动态规划和贪心算法.首先简单的介绍一下动态规划与贪心算法的各自特点及其区别.然后针对0-1背包问题进行讨论.最后给出一个简单的测试例子,联系动态规划实现0-1背包问题. 2.动态规划与贪心算法 关于动态规划的总结

动态规划专题 01背包问题详解【转】

对于动态规划,每个刚接触的人都需要一段时间来理解,特别是第一次接触的时候总是想不通为什么这种方法可行,这篇文章就是为了帮助大家理解动态规划,并通过讲解基本的01背包问题来引导读者如何去思考动态规划.本文力求通俗易懂,无异性,不让读者感到迷惑,引导读者去思考,所以如果你在阅读中发现有不通顺的地方,让你产生错误理解的地方,让你难得读懂的地方,请跟贴指出,谢谢! 初识动态规划 经典的01背包问题是这样的: 有一个包和n个物品,包的容量为m,每个物品都有各自的体积和价值,问当从这n个物品中选择多个物品放

01背包问题,经典收藏,

01背包问题描述 已知:有一个容量为V的背包和N件物品,第i件物品的重量是weight[i],收益是cost[i]. 限制:每种物品只有一件,可以选择放或者不放 问题:在不超过背包容量的情况下,最多能获得多少价值或收益 相似问题:在恰好装满背包的情况下,最多能获得多少价值或收益 这里,我们先讨论在不超过背包容量的情况下,最多能获得多少价值或收益. 基本思路 01背包的特点:每种物品只有一件,可以选择放或者不放 子问题定义状态 [cpp] view plaincopyprint? f[i][v] 

Bone Collector------HDOJ杭电2602(纯01背包问题!!!!!!详解!)

Problem Description Many years ago , in Teddy's hometown there was a man who was called "Bone Collector". This man like to collect varies of bones , such as dog's , cow's , also he went to the grave - The bone collector had a big bag with a volu

0-1背包问题的动态规划实现

一,问题描述 给定一个背包,已知背包的最大承重为packageWeight,再给出若干件(numbers件)物品,已经每件物品的重量和对应的价值. 物品的重量存储在weight[]数组中,物品的价值存储在value[]数组中. 现在要求:应该挑选哪几件物品,使得背包装下最大的价值(注意:装的物品的重量不能超过背包的承重) (本文在最后打印出了装入了哪几件物品) 二,问题分析 这是一个典型的动态规划求解.对于每件物品而言,只有两种选择,要么选中它装入背包:要么不选它.因此,这是一个0-1背包问题,