week9

任务:背包问题的求解

给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包最大承载重量为C。假设物品是可分割的,应如何选择装入背包的物品,使得装入背包中物品的总价值最大?

定义N个物品的基本数据和背包容量C,编程输出C能装下的最大价值和所选择物品的编号。

#include <iostream>

#include <algorithm>

using namespace std;

struct Goods

{

    int weight;

    int value;

    float P;

    float N; 

};

bool compare (Goods &a,Goods &b)

{

    return a.P>b.P;

}

void Greedy(Goods goods[],int n, int c)

{

    for(int i=0; i<n; i++)

    {

        if(c>goods[i].weight)

        {

            c-=goods[i].weight;

            goods[i].N=1;

        }

        else if(c>0){

            goods[i].N=c/(goods[i].weight*1.0);

            c=0;

            }

    }

}

int main()

{

    int n;

    int v;

    float total_value=0;

    float total_weight=0;

    cout<<"请输入背包的容量:"<<endl;

    cin>>v;

    cout<<"请输入物品的数量:"<<endl;

    cin>>n;

    Goods goods[n];

    cout<<"请分别输入物品的重量和价值:"<<endl;

    for(int i=0; i<n; i++)

    {   cin>>goods[i].weight>>goods[i].value;

        goods[i].N=0;

    }

sort (goods,goods+n,compare);

    //InsertSort(goods,n);

    Greedy(goods,n,v);

    for(int i=0;i<n;i++)

    {   if(goods[i].N==0.0)break;

        total_value+=(goods[i].value*goods[i].N);

        total_weight+=(goods[i].weight*goods[i].N);

        cout<<"重量为: "<<goods[i].weight<<"  "<<"价值为: "<<goods[i].value<<" 的装入的比例为: "<<goods[i].N<<endl;

    }

    cout<<"背包的容量为: "<<v<<endl;//输出背包容量

cout<<"装入背包中的物品的总重量为: "<<total_weight<<endl;

    cout<<"装入背包中的物品的总价值为: "<<total_value<<endl;

    return 0;

}

代码有部分参考,仅为学习交流使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值