题目链接:
点击打开链接
题目大意:用容量为v的背包装回价值最大的东西。
Input
输入包含多个测试实例,每个实例的第一行是两个整数v和n(v,n<100),分别表示口袋的容量和宝贝的种类,接着的n行每行包含2个整数pi和mi(0<pi,mi<10),分别表示某种宝贝的单价和对应的体积,v为0的时候结束输入。
Output
对于每个测试实例,请输出XHD最多能取回多少价值的宝贝,每个实例的输出占一行。
思路:
要想价值最大,只要单价最大,在有限的体积里才能总价值最大。所以贪心的依据是:单价最大。
代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
const int MAX = 1100;
struct node
{
int p,w,val;//p是单价,w是体积,val是总价值
}A[MAX];
int cmp(node a,node b)
{
return a.p > b.p;
}
int main()
{
int v,n,i;
while(cin>>v)
{
if(v == 0)
break;
cin>>n;
for(i = 0; i < n; i++)
{
cin>>A[i].p>>A[i].w;
A[i].val = A[i].p * A[i].w;
}
sort(A,A+n,cmp);
double sum=0;
for(i = 0; i< n;i++)
{
if(v >= A[i].w)
{
v -= A[i].w;
sum += A[i].val;
}
else
{
sum += v*A[i].p;
v = 0;
break;
}
}
cout<<sum<<endl;
}
return 0;
}