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

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

/*
	Name: 0-1背包问题
	Copyright: Analyst 
	Author: Analyst 
	Date: 02/03/14 14:26
	Description: dev-cpp 5.5.3
*/

 
//0-1背包问题
#include <stdio.h>

//返回最大值 
int max(int a, int b)
{
	return a>b?a:b;
} 

//0-1背包问题动态规划 
void backpack(int weight[], int value[], int kg)//重量,价值,容量 
{
	int maxValue[4][11] = {0};       //存放放入背包中的最大价值,4=物品个数,11=kg+1; 
	int Count[4] = {0};              //用于记录选择物品情况,count = 1表示被选取,4=物品个数 
	int temp = 0;  
	
	//得出背包装入的最大价值             
	for (int i = 0; i < 4; ++i)      //i:第几个物品 
	{
		for (int w = 0; w <= kg; ++w)//w:目前要选择物品的重量上限,每次+1,直到达到背包容量 
		{
			if (i == 0)              //i=0:表示选择前0个物品,最大价值为w。(既然是0个物品,价值直接为0) 
				maxValue[i][w] = 0;
			else if (weight[i] <= w) //weight[i]<w:表示第i个物品可以放入 
				maxValue[i][w] = max(maxValue[i-1][w],maxValue[i-1][w-weight[i]]+value[i]);
			else                     //第i个物品超过重量,不能放入 
				maxValue[i][w] = maxValue[i-1][w];
		}
	}
	
	//得出装入背包的物品序号 
	temp = kg;    //kg:背包容量
	printf(">>最佳方案<<\n"); 
	printf("背包物品序号(0开始):"); 
	for (int i = 4-1; i >= 0; --i)  //4 = 物品个数 
	{
		if (maxValue[i][temp] > maxValue[i-1][temp]) //逆推:如果if满足,则表示第i个物品被进了背包 
		{
			Count[i] = 1;
			temp -= weight[i];      //第i个物品被选进:容量-weight[i] 
		}
		else
			Count[i] = 0;           //此else代码可省略:因为初始化全部=0 
	}
	
	//打印装入背包的物品序号 
	for (int i = 0; i < 4; ++i)
	{ 
		if (Count[i] == 1)          //若被选进背包,则打印序号 
			printf("%d ",i);
	} 
	printf("\n");
	
	//打印装入背包中物品的最大价值 
	printf("背包物品价值:%d\n",maxValue[3][kg]);
}

//主函数 
int main()
{
	int Weight[] = {4,2,7,3};    //物品重量 
	int Value[] = {15,9,25,10};  //物品价值 
	int kg = 10;                 //背包容量 
	
	backpack(Weight, Value, kg); 
	
	return 0;
} 


你可能感兴趣的:(0-1背包问题(动态规划))