现在的位置: 首页 > 综合 > 正文

NYOJ-106 无语的背包问题

2017年12月19日 ⁄ 综合 ⁄ 共 988字 ⁄ 字号 评论关闭

背包问题

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
描述
现在有很多物品(它们是可以分割的),我们知道它们每个物品的单位重量的价值v和重量w(1<=v,w<=10);如果给你一个背包它能容纳的重量为m(10<=m<=20),你所要做的就是把物品装到背包里,使背包里的物品的价值总和最大。

输入
第一行输入一个正整数n(1<=n<=5),表示有n组测试数据;
随后有n测试数据,每组测试数据的第一行有两个正整数s,m(1<=s<=10);s表示有s个物品。接下来的s行每行有两个正整数v,w。
输出
输出每组测试数据中背包内的物品的价值和,每次输出占一行。
样例输入
1
3 15
5 10
2 8
3 9
样例输出
65
来源
[苗栋栋]原创
上传者
苗栋栋

我为什么要说这个背包问题无语呢?看上文中红字,给的是单位重量的价值,而且每个物品可以分割,无语了吧。。。。

所以不需要用我博客里转载的那篇文章的算法,只要按每次放入最有价值的物品,一直到放不下就行了。再次无语。。。

#include
<iostream>
02.#include
<algorithm>
03.using namespace std;
04. 
05.#define
maxs 12
06. 
07.struct node
08.{
09.int v;
10.int w;
11.}good[maxs];
12. 
13.bool compare(const node
&a,
const node
&b)
14.{
15.return a.v>b.v;
16.}
17. 
18.int main()
19.{
20.int n,s,m,sum,i;
21.cin>>n;
22.while(n--)
23.{
24.cin>>s>>m;
25.for(int i=0;i<s;i++)
26.cin>>good[i].v>>good[i].w;
27.sort(good,good+s,compare);
28.sum=0;
29.i=0;
30.while(m)
31.{
32.if(good[i].w<=m)
33.{
34.sum+=good[i].v*good[i].w;
35.m-=good[i].w;
36.i++;
37.}
38.else
39.{
40.sum+=m*good[i].v;
41.m=0;
42.}
43.}
44.cout<<sum<<endl;
45.}
46.return 0;
47.}

抱歉!评论已关闭.