01背包问题的解释可以看百度百科:01背包问题
自己不太懂,不过看这个代码好像有点理解的意思了,就先收藏一下代码吧
/********************************************************/
/*背包问题:有m件物品和一个承重为t的背包。 */
/* 第i件物品的重量是w[i],价值是v[i]。 */
/* 求解将哪些物品装入背包可使这些物品的 */
/* 重量总和不超过背包承重量t,且价值总和最大。 */
/********************************************************/
/* 变量对应,这样有意义一些,看起来很舒服
m --- count
t --- max_weight
w[i] --- weight[i]
v[i] --- value[i]
*/
#include <stdio.h>
#include <string.h>
int total_value[1010]; // 记录不同承重量背包的总价值
int weight[1010]; // 记录不同物品的重量
int value[1010]; // 记录不同物品的价值
//返回x,y的最大值
int max(int x, int y)
{
if(x > y)
return x;
return y;
}
int main()
{
int max_weight; // 背包的最大承重量
int actual_weight; // 背包实际承重
int count; // 物品的数量
int i, j; // 临时变量
memset(total_value, 0, sizeof(total_value)); //总价值初始化为0
printf("请输入背包承重量 物品的数量:\n");
scanf("%d %d", &max_weight, &count); //输入背包最大承重量max_weight、物品的数目count
printf("请输入每件物品的重量 价值:\n");
for(i = 1; i <= count; i++)
scanf("%d %d", &weight[i], &value[i]); //输入count组物品的重量weight[i]和价值value[i]
//尝试放置每一个物品
//在放入第i个物品前后,检验不同j承重量时,背包的总价值
//如果放入第i个物品后比放入前的价值提高了,则修改j承重量背包的价值,否则不变
for(i = 1; i <= count; i++)
for(j = max_weight; j >= weight[i]; j--)
total_value[j] = max(total_value[j-weight[i]]+value[i], total_value[j]);
// 获取背包的实际承重
for(actual_weight = max_weight; actual_weight > 0; actual_weight--)
if(total_value[actual_weight] != total_value[actual_weight-1])
break;
printf("装入背包的物品\"重量:价值\" :\n");
j = actual_weight; // 临时记录背包重量
for(i = 1; i <= count; i++)
{
// 如果物品被放入,一定符合这样的条件
if(total_value[j] == total_value[j-weight[i]] + value[i])
{
printf("%d:%d\n", weight[i], value[i]);
j-=weight[i];
}
}
printf("背包最终重量 价值\n");
printf("%d %d\n", actual_weight, total_value[actual_weight]);
getchar();
return 0;
}
以下为两组测试数据:
请输入背包承重量 物品的数量:
10 3
请输入每件物品的重量 价值:
1 2
8 3
5 6
装入背包的物品”重量:价值” :
1:2
5:6
背包最终重量 价值
6 8
请输入背包承重量 物品的数量:
20 5
请输入每件物品的重量 价值:
5 10
25 40
12 8
10 10
15 2
装入背包的物品”重量:价值” :
5:10
10:10
背包最终重量 价值
15 20
非常不好意思,当初记录的时候没有测试,理解也不深,现在应该可以正常运行了