题解:
给出来背包容量v和物品数量n,接下来n行分别给出每个商品单位体积的价值和物品总共的体积(注意是单位体积,不是每个物品)。求出最多能装多少价值的物品。
典型的贪心策略。
按单价排序,优先装单价高的,之后装单价低的。装满为止即可。最后算出总价值输出。
#include <iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct note{
int pi,mi;
float value;
}food[1000];
bool cmp(note a,note b)
{
return a.pi>b.pi;
}
int main()
{
int ans,sum,v,n;
while(scanf("%d",&v)!=EOF)
{
if(v==0)
break;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d%d",&food[i].pi,&food[i].mi);
}
sort(food,food+n,cmp);
ans=0,sum=0;
while(ans<n)
{
if(v>food[ans].mi)
{
sum+=food[ans].pi*food[ans].mi;
v-=food[ans].mi;
}
else
{
sum+=v*food[ans].pi;
break;
}
ans++;
}
printf("%d\n",sum);
}
//cout << "Hello world!" << endl;
return 0;
}