码迷,mamicode.com
首页 > 其他好文 > 详细

南阳106--背包问题

时间:2015-07-31 23:19:01      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:

背包问题

时间限制: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
来源
[苗栋栋]原创
上传者
苗栋栋
 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4 
 5 struct ac 
 6 {
 7     int a, b;
 8 } num[15];
 9 
10 bool cmp(ac a, ac b)
11 {
12     return a.a > b.a;
13  } 
14  
15 int main()
16 {
17     int t;
18     scanf("%d", &t);
19     while(t--)
20     {
21         int n, m;
22         scanf("%d %d", &n, &m);
23         for(int i=0; i<n; i++)
24             scanf("%d %d", &num[i].a, &num[i].b);
25         sort(num, num+n, cmp);
26         int sum = 0, total = 0;
27         for(int i=0; i<m; i++)
28         {
29             sum += num[i].b; total += num[i].a*num[i].b;
30             //printf("%d %d\n", sum, total);
31             if(sum > m) 
32             {
33                 total -= (sum - m) * num[i].a;
34                 break;
35             }
36             if(sum == m)
37                 break;
38         }
39         printf("%d\n", total);
40     }
41     return 0;
42 } 

 

南阳106--背包问题

标签:

原文地址:http://www.cnblogs.com/fengshun/p/4693366.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!