第一篇博文,写个题库上面的经典问题
一. 问题描述
给定n种物品和一个容量为c的背包,物品的重量是w[i],其价值为p[i],背包问题是如何使选择装入背包内的物品,使得装入背包中的物品的总价值最大。其中,每种物品只有全部装入背包或不装入背包两种选择。
二. 整体思路
0-1背包问题简单来说就是尽可能选出单位重量价值最大的物品放入背包,意识到这一点,整个问题就迎刃而解。
三. C语言代码
#include<stdio.h>
#define Maximum 10
int main()
{
int i,temp,best;//临时变量
int n,c;//物品种类,背包容量
int w[Maximum],p[Maximum];//物品重量,物品价值
int total_p=0;//最佳装载的总价值
float unit_p[Maximum];//物品单位重量的价值(p/w)
int judge[Maximum]={0};//判断物品是否已被装入背包,初始为零(1代表放入背包,2代表超重)
int n_judge=0;//已被判断过物品的数量(装入背包或超重)
scanf("%d %d",&n,&c);
for(i=0;i<n;++i)
{
scanf("%d",&w[i]);
}//for
for(i=0;i<n;++i)
{
scanf("%d",&p[i]);
unit_p[i]=1.0*p[i]/w[i];//计算每件物品的单位重量价值
}//for
while(c>0&&n_judge<n)
{
best=0;
for(i=0;i<n;++i)
{
if(unit_p[i]>best&&judge[i]==0)
{
best=unit_p[i];
temp=i;
}//if
}//for,求最大单位重量价值
if(w[temp]<=c)
{
c-=w[temp];
judge[temp]=1;
total_p+=p[temp];
}//if,放入背包
else
{
judge[temp]=2;
}//else,超重
++n_judge;
}//while
printf("%d\n",total_p);//输出最佳装载的总价值
return 0;
}//0-1背包问题
题目仅要求求出最佳装载的总价值,故无需太过复杂。
也可将求最大单位重量价值的代码变为一个子函数