标题:贪新算法的背包问题的程序出了点小问题,求指教!!!!!!!!
只看楼主
小光vs小熊
Rank: 2
等 级:论坛游民
帖 子:18
专家分:10
注 册:2011-9-5
结帖率:0
 问题点数:0 回复次数:0 
贪新算法的背包问题的程序出了点小问题,求指教!!!!!!!!
假定有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)。
当货物总重量∑Wi小于或等于M时,把所有货物装入,总价值就达到最大。因此,关键是解决当总重量大于M时装货的方法。
我们先从一个具体例子入手来研究一下本题的特点。
    设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;
}
求指教啊!!!!!!!!!!!!!!!!!!!!!!
搜索更多相关主题的帖子: 背包 problem 价值 
2012-05-03 21:48



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-366896-1-1.html




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

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