算法设计与分析 普通揹包 贪心

输入:先输入物品的个数n,再输入揹包的容量c,然后依次输入物品的重量wi,最后依次输入物品的价值vi。注意:所有值都不能随机生成!!!

输出:物品的选择向量xi,0=<xi=<1。

示例:输入:320  18 15 10 25 24 15,输出:0.0   1.0    0.5

#include <iostream>
using namespace std;

void swp(double a[],int i,int j)
{
    double t;
    t = a[i];
    a[i] = a[j];
    a[j] = t;
}

void Knapsack(int n,double c,double w[],double v[],double x[],int num[])
{
    int i,j,t;
    for(i = 0;i < n-1; i++)
    {
        for(j = i+1; j < n; j++)
        {
            if(v[j]/w[j] > v[i]/w[i])
            {
                swp(w,i,j);
                swp(v,i,j);

                t = num[i];
                num[i] = num[j];
                num[j] =t;
            }
        }
    }

    for(i = 0; i < n; i++)
    {
        if(w[i] > c)
        {
            break;
        }
        x[num[i]] = 1;
        c -= w[i];
    }
    if(i < n)
    {
        x[num[i]] = c/w[i];
    }
}

int main()
{
    int n,i;
    int num[1000];
    double c,w[1000],v[1000],x[1000];
    cin >> n >> c;
    for(i = 0; i < n; i++)
    {
        cin >> w[i];
        num[i] = i;
        x[i] = 0;
    }
    for(i = 0; i < n; i++)
    {
        cin >> v[i];
    }
    Knapsack(n,c,w,v,x,num);
    for(i = 0; i < n; i++)
    {
        cout << double(x[i]) << " ";
    }
    cout << endl;
    return 0;
}
点赞