部分背包问题

题目描述

阿里巴巴走进了装满宝藏的藏宝洞。藏宝洞里面有 N(N≤100)N(N100) 堆金币,第 ii 堆金币的总重量和总价值分别是 mi,vi(1≤mi,vi≤100)mi,vi(1mi,vi100)。阿里巴巴有一个承重量为 T(T≤1000)T(T1000) 的背包,但并不一定有办法将全部的金币都装进去。他想装走尽可能多价值的金币。所有金币都可以随意分割,分割完的金币重量价值比(也就是单位价格)不变。请问阿里巴巴最多可以拿走多少价值的金币?

输入描述

第一行两个整数 N,TN,T

接下来 NN 行,每行两个整数 mi,vimi,vi​。

输出描述

一个实数表示答案,输出两位小数。

样例输入

Copy to Clipboard
4 50
10 60
20 100
30 120
15 45

样例输出

Copy to Clipboard
240.00


思路:

优先放平均价值最高的。首先按平均价值排序,然后装。装得下一份则全装,容量减少物品容量,价值增加物品全部价值;装不下一份则价值增加

剩余容量*平均价值,此时装满,break。

代码:

复制代码
#include<iostream>

#include<vector>

/*

 1.本题较为简单

 2.注意点:平均价值需要double,除法时除数或被除数强制类型转换

 */

 

using namespace std;

 

 

int main(){

    int n,v;

    while(cin>>n>>v){

    

        struct{

            int weight;

            int price;

            double pervalue;

            

        }goods[n],temp;

    

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

        cin>>goods[i].weight>>goods[i].price;

        goods[i].pervalue=(double)goods[i].price/(double)goods[i].weight;

    }

        

        for (int i=0; i<n-1; ++i)  //比较n-1轮

            {

                for (int j=0; j<n-1-i; ++j)  //每轮比较n-1-i次,

                {

                    if (goods[j].pervalue < goods[j+1].pervalue)

                    {

                        temp = goods[j];

                        goods[j] = goods[j+1];

                        goods[j+1] = temp;

                    }

                }

            }//按照pervalue冒泡

        double sumprice = 0;

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

            if(v>=goods[i].weight){

                sumprice+=goods[i].price;

                v-=goods[i].weight;

            }

            else{

                sumprice+=(double)v*goods[i].pervalue;

                break;

            }

            

        }

        

        printf("%.2f\n",sumprice);

 

    

    }//while

    return 0;

}
复制代码

 

posted @   Fordson  阅读(130)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示