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;
}