NYOJ 106-背包问题

时间限制: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

题目来源

http://acm.nyist.net/JudgeOnline/problem.php?pid=106

程序实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include<iostream>
#include<algorithm>
using namespace std;
//结构体加上sort的cmp条件,实现了对单位价值排序时,也同时排好对应的重量。
struct P{
int v;//单位重量的价值
int w;//重量
}*a;//需要多少再申请多少
bool cmp(P x, P y){
return x.v>y.v;//按照价值降序排列
}

int main(){
int i,n,s,m,sum=0;
cin>>n;
while(n--){
cin>>s>>m;
a = new P[s];
for(i=0; i<s; i++)
cin>>a[i].v>>a[i].w;
sort(a,a+s,cmp);
for(i=0; i<s; i++){
if(a[i].w<=m){
sum = sum + a[i].v*a[i].w;
m = m - a[i].w;
}else{
sum= sum + m*a[i].v;
break;//提前结束循环
}
}
cout<<sum<<endl;
delete a;sum = 0;//释放空间
}
}

收获

  1. 这是个经典的背包问题,用贪心法就可以了。
  2. 也学会了用结构体加上sort的cmp条件,实现了对一组数据排序时,顺便把对应的另一组数据也排了。之前会场安排问题还是用两组数组分别来排的Orz。
文章目录
  1. 1. 程序实现
  2. 2. 收获

20160316-acm-8/

本页二维码