NYOJ 106 背包问题(贪心,经典题目)

来源:互联网 发布:网络布局要看什么书籍 编辑:程序博客网 时间:2024/05/18 14:13

背包问题

时间限制: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。
输出
输出每组测试数据中背包内的物品的价值和,每次输出占一行。
样例输入
13 155 102 83 9
样例输出
65


思路:

经典的贪心问题,貌似动态规划做题也可以。

反正经典的题目做一个就少一个。。。。。。


代码:

#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<algorithm>#define MYDD 10103using namespace std;struct Q {//慢点,你会喜欢结构体的 int v;//单位重量的价值int w;//总重量} dd[32];bool cmp_v(Q x,Q y) {return x.v>y.v;//按照单位重量价值递减排序}int main() {int n,s,m,t;// m:背包容纳的总重量scanf("%d",&t);while(t--) {scanf("%d%d",&n,&m);for(int j=0; j<n; j++)scanf("%d%d",&dd[j].v,&dd[j].w);sort(dd,dd+n,cmp_v);//单位价值高的优先选取 int ans=0;for(int j=0; j<n; j++) {if(m-dd[j].w>=0) {ans=ans+dd[j].v*dd[j].w;m-=dd[j].w;} else {ans=ans+dd[j].v*m;break;}}printf("%d\n",ans);}return 0;}


0 0
原创粉丝点击