基于贪心算法的背包问题

来源:互联网 发布:学习辅助软件 编辑:程序博客网 时间:2024/05/16 06:31

转载: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;  }
原创粉丝点击