普通 背包问题

#include
using namespace std;
void Sort(int n, float v[], float w[], int x[])
{
    float b[100];
    for (int i = 1; i <= n; i++)x[i] = i;
    for (int i = 1; i <=n; i++)
    {
        b[i] = v[i] / w[i];//算出每个物品单位重量的价值
    }
    
    for (int i = 1; i <=n; i++)
    {
        for (int j = 1; j <= n-i+1; j++)
        {
            if (b[j] < b[j +1])
            {
                float temp = b[j]; b[j] = b[j+1 ]; b[j +1] = temp;//按照单位重量价值从大到小排序
                float temp2 = w[j]; w[j] = w[j +1]; w[j+1 ] = temp2;//把单位价值大的排在前面
                int temp1 = x[j]; x[j] = x[j+1]; x[j+1 ] = temp1;//排序后记录物品的原位置
            }

        }
    }
    
}
void pack(int n, float m, float v[], float w[], int x[])
{
    Sort(n, v, w, x);//将物品的重量按照单位价值的大小排序
    float c[100];
    int i;
    for ( i = 1; i <= n; i++)c[i] = i;
    for ( i = 1; i <= n; i++)
    {
        if (w[i] > m)break;
            int a = x[i];//a记录物品的原位置
            c[a] = 0;//作为选择后的标记 0代表选择 1代表没选
            m -= w[i];
    
    }
    if (i <= n)c[x[i]] = m / w[i];

    cout << "物品的选择是:(" << " ";

    for (int i = 1; i <= n; i++)
    {

        if (c[i] == 0)
            cout << 1 << " ";
        else if (c[i] > 0 && c[i] < 1)
            cout << c[i] << " ";
        else
            cout << 0 << " ";
    }
    cout << ")";
}

int main()
{
    int n, m;
    cout << "请输入物品的个数:";
    cin >> n;
    cout << "请输入背包的容量:";
    cin >> m;
    float w[100], v[100];
    int x[100];
    cout << "请分别输入物品的重量:";
    for (int i = 1; i <= n; i++)
    {
        cin >> w[i];
    }
    cout << "请分别输入物品的价值:";
    for (int i = 1; i <= n; i++)
    {
        cin >> v[i];
    }
    pack(n, m, v, w, x);
    system("pause");
    return 0;
}

你可能感兴趣的:(算法)