01背包问题之动态规划

原创 2017年01月03日 22:06:46
#include <stdio.h>
#include <stdlib.h>

#define random(x) (rand()%x)+1 //产生随机数 (0,100]
#define N 5    //物品规模
#define C 6   //背包容量
int x[N];      //解向量

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


//输出解向量
void printx(int x[],int n){
	printf("解向量x={");
	for(int i=0;i<n-1;i++){
		printf("%d,",x[i]);
	}
	printf("%d}\n",x[n-1]);
}

void dynamicProgramming(int w[],int v[],int x[],int n,int c,int  m[][C+1]){
	int jMax=min(w[n-1]-1,c);
	for(int j=0;j<=jMax;j++) m[n-1][j]=0;//第n个物品不能放入容量j不够的包里
	for(int j=w[n-1];j<=c;j++) m[n-1][j]=v[n-1];//第n个物品能放入容量为j的背包
	for(int i=n-2;i>=0;i--){
		jMax=min(w[i]-1,c);
		for(int j=0;j<=jMax;j++) m[i][j]=m[i+1][j];//容量不够,所以都不放入
		for(int j=w[i];j<=c;j++) m[i][j]=max(m[i+1][j],m[i+1][j-w[i]]+v[i]);//放和不放比较,如果最大价值能增加就放,否则不放
	}
	m[0][c]=m[1][c];
	if(c>=w[0]) m[0][c]=max(m[0][c],m[1][c-w[0]]+v[0]);

	//打印数组m
	printf("m数组如下所示:\n");
	for(int i=0;i<n;i++){
		for(int j=0;j<C+1;j++){
			printf("%7d",m[i][j]);
		}
		printf("\n");
	}

	//由二维数组m构造最优解
	for(int i=0;i<n-1;i++){
		if(m[i][c]==m[i+1][c]) x[i]=0;
		else {x[i]=1;c=c-w[i];}
	}
	x[n-1]=(m[n-1][c])?1:0;
}

void main(){
	//用数组初始化物品节点,背包容量为总重量的一半
	int v[N]={5,4,3,6,8};	//价值数组
	int w[N]={2,1,3,2,4};	//重量数组
	int c=0;
	int m[N][C+1];
	dynamicProgramming(w,v,x,N,C,m);
	printx(x,N);
}

动态规划之01背包问题讲解

给大家附上一个题目吧,便于理解 ctest有n个苹果,要将它放入容量为v的背包。给出第i个苹果的大小和价钱,求出能放入背包的苹果的总价钱最大值。 输入:每组测试数据第一行为2个正整数,...
  • su20145104009
  • su20145104009
  • 2016年05月04日 10:21
  • 3434

动态规划之背包问题——Java实现

背包问题具体例子:假设现有容量10kg的背包,另外有3个物品,分别为a1,a2,a3。物品a1重量为3kg,价值为4;物品a2重量为4kg,价值为5;物品a3重量为5kg,价值为6。将哪些物品放入背包...
  • sdgihshdv
  • sdgihshdv
  • 2017年08月08日 22:32
  • 349

动态规划的用法——01背包问题

动态规划的用法——01背包问题   问题主题:著名的01背包问题 问题描述: 有n个重量和价值分别为wi、vi的物品,现在要从这些物品中选出总重量不超过W的物品,求所有挑选方案...
  • luoweifu
  • luoweifu
  • 2014年01月19日 19:10
  • 16043

Vijos P1133 装箱问题(动态规划,01背包,NOIP)

通过动态规划求物品所占用的最大容量,用总容量减去最大容量,就可求得最小剩余空间...
  • qq_35855297
  • qq_35855297
  • 2016年08月20日 19:39
  • 248

动态规划解决01背包问题(java实现)

01背包问题与背包问题的区别在于,01背包,物品的选择只有两种一种是拿,另一种是不拿,而背包问题在于,物品可以只取一部分。所以01背包问题不能用贪心算法解决。 以dp[i][j]表示用i种物品,重量为...
  • qq_22222499
  • qq_22222499
  • 2017年04月30日 13:52
  • 1411

总结——01背包问题 (动态规划算法)

0-1 背包问题:给定 n 种物品和一个容量为 C 的背包,物品 i 的重量是 wi,其价值为 vi 。 问:应该如何选择装入背包的物品,使得装入背包中的物品的总价值最大?...
  • xp731574722
  • xp731574722
  • 2017年04月25日 20:57
  • 11041

【软考】动态规划之01背包问题

最近学习软考,其中算法这遇到01背包问题,经过一番探索,终于通过资料来了解了一些,有了一些头绪,下面咱们一起看看学习下: 首先解释下什么是01背包问题:给定一组共n个物品,每种物品都有自己...
  • z15732621582
  • z15732621582
  • 2016年10月08日 16:01
  • 701

动态规划_01背包问题_Java实现

什么是动态规划?动态规划就是将一个大问题不断向下拆分成小问题,直到拆分出的小问题可以求出其解,然后将小问题的解不断的向上合并,最终得到大问题的解决方案。...
  • ljmingcom304
  • ljmingcom304
  • 2015年12月16日 15:11
  • 5397

算法学习 - 01背包问题(动态规划C++)

动态规划 01背包 问题描述 求解思路 代码实现 放入哪些物品 代码动态规划我在上一篇博客里已经讲了一点动态规划了,传送门:算法学习 - 动态规划(DP问题)(C++)这里说一下,遇到动态规划应该如何...
  • chenfs1992
  • chenfs1992
  • 2015年04月28日 21:09
  • 3319

动态规划算法-解决01背包问题

问题描述:     现有N个物品,其每个物品对应的重量为Wi,对应的价值为Vi (0 =用C[N][K]可以表示,在一个固定承重为K的背包中放入N个物品时的最大价值。        C[N][K] ...
  • u012787116
  • u012787116
  • 2016年07月24日 14:42
  • 1609
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:01背包问题之动态规划
举报原因:
原因补充:

(最多只允许输入30个字)