问题标题: 洛谷:P2240 部分背包贪心 WA了前两个点A了后三个点?

0
0
已解决
黄子扬
黄子扬
初级天翼
初级天翼
#include<bits/stdc++.h>
using namespace std;
struct coin
{
    int m,v;    
}a[105];
bool cmp(coin x,coin y)
{
    return x.v*y.m>y.v*x.m;
}
int main()
{
    int n,t,c,i;
    float ans=0;
    scanf("%d%d",&n,&t);
    c=t;
    for(int i=1;i<=n;i++)
        scanf("%d%d",&a[i].m,&a[i].v);
    sort(a,a+n,cmp);
    for(i=0;i<n;i++)
    {
        if(a[i].m>c)
            break;
        c-=a[i].m;
        ans+=a[i].v;
    }
    if(i<n)
        ans+=1.0*c/a[i].m*a[i].v;
    printf("%.2lf",ans);
    return 0;
}

 


0
已采纳
王子健
王子健
初级天翼
初级天翼

千万不要被题目给误导了,这道题是贪心。

所有金币都可以分开,也就是说只要按照性价比最高的取一定得到的价值最大。

性价比就是这堆金币的价值除以重量。

只需要把这nn堆金币按性价比排序就行了。

然后依次遍历,如果背包中剩余可以拿的重量大于等于这堆金币的重量,就全拿,否则直接装满。

直接装满这里注意一下整型转浮点的细节就好了。

 

(摘自洛谷题解,仅供参考)

我要回答