| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 425 人关注过本帖
标题:求助,以下的程序怎么改啊
只看楼主 加入收藏
小光vs小熊
Rank: 2
等 级:论坛游民
帖 子:18
专家分:10
注 册:2011-9-5
结帖率:0
收藏
已结贴  问题点数:10 回复次数:2 
求助,以下的程序怎么改啊
假定有n个物体和一个背包,物体i 有质量wi,价值为pi,而背包的载荷能力为M。若将物体i的一部分xi(1<=i<=n,0<=xi<=1)装入背包中,则有价值pi*xi。在约束条件(w1*x1+w2*x2+…………+wn*xn)<=M下使目标(p1*x1+p2*x2+……+pn*xn)达到极大,此处0<=xi<=1,pi>0,1<=i<=n.这个问题称为背包问题(Knapsack problem)。
    设n=3;M=20。
     W1=15  W2=10  W3=8
     P1=18  P2=15  P3=10
 
下面是我写的一个程序,不过好像有点问题,正确的结果应该是输出X1=2,X2=10,X3=8
 但是输出的是:X1=10,X2=8,X3=2.
 #include <stdio.h>
 #include <math.h>
 #define N 50
 
float find(float p[N],float w[N],float x[N] ,float M,int n) /*先放单位价值量大的物体,再考虑小的物体*/
 {
     int i;
     float maxprice;
     for (i = 0; i < n; i++)
     x[i] = 0;
     i = 0;
     maxprice=0;
     while (i < n && w[i] < M)
     {
         M=M-w[i];
         x[i] =w[i]; /* 表示放入数量 */
         maxprice=maxprice+p[i];
         x[n-1]=M;
         i++;
     }
     if (i < n &&M> 0)
     {
         maxprice=maxprice+p[i]*x[i]/w[i];
         i++;
     }
     return maxprice;
 }
 
int main()
 {
     int n,flag=1;
     float temp,M,w[N],p[N],x[N];
     int k;
     printf("输入物品种数:\n");
     scanf("%d",&n);
     printf("输入背包重量:\n");
     scanf("%f",&M);
     printf("输入%d个物品的重量:\n",n);
     for(k=0;k <n;k++)
     scanf("%f",&w[k]);
     printf("输入%d个物品的价值:\n",n);
     for(k=0;k <n;k++)
     scanf("%f",&p[k]);
 

    while (flag != 0) /* 冒泡法 对单位价值进行排列*/
     {
         flag = 0;
         for (k = 0; k < n-1; k++)
         {
             if (p[k]/w[k] < p[k+1]/w[k+1])
             {
                 temp = p[k];
                 p[k] = p[k+1];
                 p[k+1] = temp;
                 temp = w[k];
                 w[k] = w[k+1];
                 w[k+1] = temp;
                 flag = 1;
             }
         }
     }
 
    printf("总价值最大是:%f\n",find(p,w,x,M,n));
     for(k= 0; k < n; k++)
     {
         if(x[k]!=0)
         {
              printf("X%d: %f\n",k+1,x[k]);
 
        }
     }
     system("pause");
     return 0;
 }
 求指教啊!!!!!!!!!!!!!!!!!!!!!!
搜索更多相关主题的帖子: 背包 include problem 
2012-05-04 13:38
渚清沙白
Rank: 3Rank: 3
来 自:湖南财政经济学院
等 级:论坛游侠
帖 子:25
专家分:114
注 册:2012-5-5
收藏
得分:5 
应该是先放,单位价值最大的不,题目的意思是吧物体i可以放入xi,而包的容量有限,所以不是考虑某个物体的价值,而是看哪个物体的单位质量的价值排序。。。。。。
2012-05-09 22:41
a745043791
Rank: 4
等 级:业余侠客
帖 子:95
专家分:260
注 册:2012-2-12
收藏
得分:5 
哥,我不知道是我错了还是你错了。不是0=<xi=<1的吗?为什么后来又成10,8,2了?
如果是0=<xi<1的话xi应该是质量所占比例,pi是物体i总价值,
如果想你那样 xi应该表示的是质量,pi是的物体i单位质量的价值,你能不能说清楚了?
2012-05-11 20:29
快速回复:求助,以下的程序怎么改啊
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028578 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved