Datahub
数据改变生活

1353: 背包问题

发表时间:2022-10-28 23:23

1353: 背包问题

时间限制: 1 Sec   内存限制: 128 MB

题目描述

现在有很多物品(它们是可以分割的),我们知道它们每个物品的单位重量的价值v和重量w1<=v,w<=100);如果给你一个背包它能容纳的重量为m10<=m<=200,你所要做的就是把物品装到背包里,使背包里的物品的价值总和最大。

输入

第一行输入一个正整数n1<=n<=5,表示有n组测试数据;
随后有n测试数据,每组测试数据的第一行有两个正整数sm1<=s<=10;s表示有s个物品。接下来的s行每行有两个正整数vw

输出

输出每组测试数据中背包内的物品的价值和,每次输出占一行。

样例输入 Copy

1

3 15

5 10

2 8

3 9

样例输出 Copy

65

解析:考虑到物品可以分割。其实我们只要不断装单价最高的物品就行。贪心算法。

#include<bits/stdc++.h>

using namespace std;

struct Node{

int v,w;

}a[15];

int n,s,m;

bool cmp(Node x,Node y){return x.v>y.v;}

int main(){

scanf("%d",&n);

while(n--){

scanf("%d%d",&s,&m);

for(int i=1;i<=s;i++)

scanf("%d%d",&a[i].v,&a[i].w);

sort(a+1,a+1+s,cmp);

int ans=0,i=1;

while(m){

if(i>s) break;

if(a[i].w>=m){ans+=m*a[i].v;break;}

ans+=a[i].w*a[i].v;

m-=a[i].w;i++;

}

printf("%d\n",ans);

}

return 0;

}


QQ:258506508                                     联系电话:020-000000    000-000000                                   联系邮箱:xxx@.co.m                                     联系地址:XXX省XXX市XXX县XXX路