nyoj 106 背包问题

背包问题

时间限制:3000ms | 内存限制:65535KB

难度: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 <algorithm>using namespace std;const int maxn = 20;struct res{int v,w;}arr[maxn];int s,m;bool cmp(res x,res y)//价值 从小到大排序 { return x.v>y.v;}int main(){int n,i,sum;scanf("%d",&n);while(n–){scanf("%d%d",&s,&m);for(i=0;i<s;++i){scanf("%d%d",&arr[i].v,&arr[i].w);}sort(arr,arr+s,cmp);sum=0;for(i=0;i<s;++i){if(m-arr[i].w>0)//能取完全部都取{sum+=arr[i].v*arr[i].w;m-=arr[i].w;}else//不能取完,取一部分{sum+=m*arr[i].v;break;}}printf("%d\n",sum);}return 0;}

版权声明:本文为博主原创文章,未经博主允许不得转载。

青春不是年华,而是心境;青春不是桃面丹唇柔膝,

nyoj 106 背包问题

相关文章:

你感兴趣的文章:

标签云: