背包问题系列之完全背包

背包问题解析

题目描述:一个小偷抢劫了一个保险箱,发现里面装有N种大小与价值不等的物品, 但他只有一个容量为 M 的小背包来拿走这些物品
,如何组织这些物品,让小偷用这个小容量背包拿走最大价值的物品。

例如:5种大小与价值不等的物品, 背包容量为 17
0 1 2 3 4
item A B C D E
size 3 4 7 8 9
value 4 5 10 11 13

那么, 这个背包可以拿走的最高总值为 24
组合方式分别为:
ACC
DE

别人写的算法,终于完全搞明白了,尽管不是自己想的。

#include<stdio.h>
#include<string.h>
#define VOLUMN 17 //背包容量
#define KIND 5 //物品种类
struct thing
{
char name;
int size;
int value;
}item[KIND]={{'A',3,4},{'B',4,5},{'C',7,10},{'D',8,11},{'E',9,13}};
int main()
{
int v[VOLUMN+1]; //VOLUMN体积下存储的总价值
int num[VOLUMN+1][KIND+1]; //前面一维代表体积,后面一维代表东西种类的序号,存放某体积下,某东西种类的数量
int i,j,k,m;
int max; //背包里面能装的最大价值
for(i=0;i<VOLUMN+1;++i)
{
v[i]=0;
}
for(i=0;i<VOLUMN+1;++i)
{
for(j=0;j<KIND;++j)
{
num[i][j]=0;
}
}
for(i=0;i<KIND;++i)
//找出背包能装的最大价值
{
for(j=item[i].size;j<VOLUMN+1;++j)
{
if(v[j]<v[j-item[i].size]+item[i].value)
{
v[j]=v[j-item[i].size]+item[i].value;
}
}
}
printf("the biggest value is:%d\n",max=v[VOLUMN]);
printf("the answer is:\n");
for(i=0;i<VOLUMN+1;++i)
{
v[i]=0;
}
for(i=0;i<KIND;++i)
//计算最优解的各种物品的个数
{
for(j=item[i].size;j<=VOLUMN;++j)
{
if(v[j]<=v[j-item[i].size]+item[i].value)
{
v[j]=v[j-item[i].size]+item[i].value;
memcpy(num[j],num[j-item[i].size],sizeof(num[j]));
++num[j][i];
if(j==VOLUMN&&v[j]==max)
//找出背包最大价值的组合
{
for(k=0;k<KIND;++k)
{
for(m=0;m<num[VOLUMN][k];m++)
{
printf("%c",item[k]);
}
}
printf("\n");
}
}
}
}
return 0;
$}

转载于:https://www.cnblogs.com/jim-wu/archive/2011/09/30/2196057.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值