关闭

动态规划:0/1背包问题

标签: 动态规划01背包问题算法
1032人阅读 评论(1) 收藏 举报
分类:

动态规划:0/1背包问题

1、问题简介

     百度百科:0/1背包问题


2、方法

     动态规划,主要用到的公式见下面(符号意思见代码处解释)


3、解决代码

// 动态规划法求0/1背包问题
// by 孙琨SealSun at UCAS 
// 2015.11.19 
#include<iostream>
using namespace std;
#define MAX 256
int min(int a,int b);
int max(int a,int b);
void Knapsack(int n,int c,int v[],int w[],int m[][MAX]); // 求最优值,价值最大 
void Traceback(int n,int c,int w[],int x[],int m[][MAX]);  // 求最优解,具体哪件物品被放入 

int min(int a,int b){
	return a<b?a:b;
}

int max(int a,int b){
	return a>b?a:b;
}

 // 逆推法,从m(n,c)-->m(n-1,c)--------->m(1,c)
 // 求得最优值,及所得最大价值 
void Knapsack(int n,int c,int v[],int w[],int m[][MAX]){ // n物品数,c背包容量,v各物品价值,w各物品重量,m最优解 
	// m(n,c) 
	int jMax = min(w[n],c); // 先验条件,j的最大取值范围 
	for(int j=0; j<jMax; j++){
		m[n][j] = 0;
	}
	for(int j=w[n];j<=c;j++){
		m[n][j]=v[n];
	}
	
	// m(2,c)
	for(int i=n-1; i>1;i--){
		jMax = min(w[n],c);
		for(int j=0; j<jMax; j++){
			m[n][j] = m[n+1][j];
		}
		for(int j=w[i];j<=c;j++){
            // max(第i个物品未被选上,第i个物品被选上) 
			m[i][j] = max(m[i+1][j],m[i+1][j-w[i]]+v[i]);
		}
	}
	
	// m(1,c)
	m[1][c] = m[2][c];
	if(c > w[1]){
		m[1][c] = max(m[1][c],m[2][c-w[1]]+v[1]);
	}
	
	// 输出 
	int x[MAX]; 
	Traceback(n,c,w,x,m);
	cout << "最大物品价值为:" <<endl;
	cout << m[1][c]<<endl;
} 

 // 求得最优解,即具体每个背包是否放入 
 // x[i]表示第i个物品是否被选上,值为1则选上,为0则弃 
void Traceback(int n,int c,int w[],int x[],int m[][MAX]){
	for(int i=1; i<n; i++){
		if(m[i][c] == m[i+1][c]){ // 第i个物品没被选上 
			x[i] = 0;
		}
		else{ // 第i个物品被选上
			x[i] = 1;
			c -= w[i];
		}
	}
	
	x[n]= (m[n][c])?1:0; // 若第n个物品的价值存入m,则被选上 
	
	cout << "选中的物品是:"<<endl; 
	cout << "第" ; 
	for(int i=1; i<=n; i++){
		if(x[i] == 1){
			cout << i << " ";
		}
	}
	cout << "件物品" << endl;
}

// 测试用例
int main(){
	int n; // 物品数 
	int c; // 背包容量 
	int w[MAX]; // 各物品的重量 
	int v[MAX]; // 各物品的价值 
	int m[MAX][MAX]={0}; // 保存的当前最大价值,例m[2][c]表示去掉第1个物品后的最大价值 
	cout << "请输入背包的最大容量:"<<endl;
	cin >> c; 
	cout << "请输入物品的个数:"<<endl; 
	cin >> n;
	cout << "请分别输入物品的重量:"<<endl; 
	for(int i=1; i<=n; i++){
		cin >> w[i];
	}
	cout << "请分别输入物品的价值:"<<endl; 
	for(int i=1; i<=n;i++){
		cin >> v[i];
	}
    Knapsack(n,c,v,w,m);	
	return 0;
} 


4、结果截屏



1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

动态规划0—1背包问题

动态规划0-1背包问题 Ø    问题描述:    给定n种物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为C。问应如何选择装入背包的物品,使得装 入背包中物品的总价值最大? Ø   对于一种物品,要么装入背包,要么不...
  • dapengbusi
  • dapengbusi
  • 2012-04-15 23:54
  • 110166

动态规划之详细分析0-1背包问题

题目:   有 N 件物品和一个容量为 V 的背包。第 i 件物品的费用是 w[i],价值是 p[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。   本文按照动态规划的标准模式解析:http://blog.csdn.net/hearthouga...
  • Hearthougan
  • Hearthougan
  • 2016-12-26 01:50
  • 1075

0-1背包问题(动态规划)

  • 2015-11-17 14:49
  • 1KB
  • 下载

0-1背包 动态规划问题详解

  • 2013-11-13 16:53
  • 914KB
  • 下载

[算法]动态规划之0-1背包

问题描述描述:石头收藏家小明在徒步登山的时候发现了一堆美丽的石头。这些石头价值不菲,但是都很重,小明自身的力气有限,一次只能拿他拿得动的一部分。每块石头的重量不同,价值也不同。问小明在力所能及的情况下能拿走价值多少的石头。 说明:小明只能搬运一次。 例如:小明只能拿得动 10 kg,每块石头的重...
  • kiss_the_sun
  • kiss_the_sun
  • 2017-02-08 17:12
  • 371

0-1背包问题入门小结 动态规划(DP)经典题目 POJ324 POJ1276

最近在做背包问题,今天写点东西总结一下。         背包问题,常见的有三种类型:基本的0-1背包、完全背包和多重背包、二维背包        ...
  • sj13051180
  • sj13051180
  • 2011-08-15 10:42
  • 24070

动态规划—0-1背包问题(最易理解的讲解)

0-1背包问题是最广为人知的动态规划问题之一,拥有很多变形。尽管在理解之后并不难写出程序,但初学者往往需要较多的时间才能掌握它。小编写这篇文章力争做到用通俗易懂的语言,最少的公式把0-1背包问题讲解透彻。
  • u010293698
  • u010293698
  • 2015-10-08 22:50
  • 2641

动态规划解决0/1背包问题

之前总结了利用穷举法,贪婪法解决0/1背包的方法,同时也通过Fibnacci介绍了动态规划,那么该如何来利用动态规划来解决0/1背包问题呢? 首先动态规划有两个条件; 如果可以把局部子问题的解结合起来得到全局最优解,那这个问题就具备最优子结构 如果计算最优解时需要处理很多相同的问题,那么这个问...
  • changyuanchn
  • changyuanchn
  • 2016-05-18 20:12
  • 2123

动态规划之0-1背包问题

首先介绍一下动态规划... 设计一个动态规划算法,通常可按照以下几个步骤进行: (1) 找出最优解的性质,并刻画其结构特征。 (2) 递归地定义最优解的值 (3) 以自底而上的方式计算出最优值 (4) 根据计算最优值时得到的信息,构造一个最优解。 对于一个给定的问题,若具有以下两个性质,...
  • yeepom
  • yeepom
  • 2013-03-24 11:31
  • 35346

动态规划—0-1背包问题(最易理解的讲解)

0-1背包问题是最广为人知的动态规划问题之一,拥有很多变形。尽管在理解之后并不难写出程序,但初学者往往需要较多的时间才能掌握它。小编写这篇文章力争做到用通俗易懂的语言,最少的公式把0-1背包问题讲解透彻。
  • u010293698
  • u010293698
  • 2015-10-08 22:50
  • 2641
    个人资料
    • 访问:248913次
    • 积分:3433
    • 等级:
    • 排名:第11321名
    • 原创:86篇
    • 转载:23篇
    • 译文:0篇
    • 评论:60条
    最新评论