转载:http://blog.csdn.net/urtheappleinmyeye/article/details/19269455
【题目】
有一个背包,背包容量是M=150。有7个物品,物品可以分割成任意大小。
要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。
物品 A B C D E F G
重量 35 30 60 50 40 10 25
价值 10 40 30 50 35 40 30
【实验代码】
#include<stdio.h>
/* *x----存放物品的数组 m-----背包的容量 */
static void knapsack(int n,float m,float *v,float *w,float *x)
{
sort(n,v,w);
int i;
for(i=0;i<n;i++)
{
if(*(w+i)>m)
break;
//可以存放该物品时,置1
*(x+i)=1;
//放入后,背包的容量减少
m-=*(w+i);
}
//当此时背包的容量不够存放整个物品的情况时,存放一部分
if(i<n)
*(x+i)=m/(*(w+i));
}
/* n-----背包可以存放物品的种类 *p----指向存放物品价值的数组 *q----指向存放物品重量的数组 */
void sort(int n,float *p,float *q)
{
int i;
int j;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if((*(p+i))/(*(q+i))<(*(p+j))/(*(q+j)))
{
float f;
f=*(p+i);
*(p+i)=*(p+j);
*(p+j)=f;
f=*(q+i);
*(q+i)=*(q+j);
*(q+j)=f;
}
}
int main()
{
int n=7;//物品种类
int m=150;//背包容量
float w1[7]={35,30,60,50,40,10,25};//各种物品的重量
float v1[7]={10,40,30,50,35,40,30};//各种物品的价值
float x1[6];//存放各种物品的存放情况
float *x;
float *w;
float *v;
w=w1;
v=v1;
x=x1;
int i;
for(i=0;i<n;i++)
*(x+i)=0;
knapsack(n,m,v1,w1,x);
printf("\n物品重量:\n");
for(i=0;i<n;i++)
printf("%.1f\t",*(w+i));
printf("\n\n物品价值:\n");
or(i=0;i<n;i++)
printf("%.1f\t",*(v+i));
printf("\n\n物品存放情况:\n");
for(i=0;i<n;i++)
printf("%.1f\t",*(x+i));
return 0;
}