贪心:1225:金银岛(信息学)

    技术2025-05-03  21

    本题链接: 1225:金银岛 本题是典型的背包问题,和本蒟蒻之前写过的背包问题一样。 贪心:P2240 【深基12.例1】部分背包问题(洛谷) 本题重点同样在于,先按照均价对每堆财宝进行排序,假如为降序,第一堆就是均价最高的,我们选择将其拿走,然后是第二个…(当然在代码中要加入对承重的判断)

    #include<bits/stdc++.h> using namespace std; struct Node { double w;//重量 double v;//价值 double p;//均价 }a[1001]; double T,b[1001];//T为承重 int N,z; bool cmp(Node a,Node b) { return a.p > b.p; } double acc(double T,int N)//计算函数 { double sum=0; for (int i = 0; i <N; i++) { cin >> a[i].w >> a[i].v; a[i].p = a[i].v / a[i].w; } sort(a ,a+ N,cmp); for (int i = 0; i < N; i++) { if (T - a[i].w > -0.0001)//因为数据类型为double { T -= a[i].w; sum += a[i].v; } else { sum += T * a[i].p;//分割金币,为代码核心点 break; } } return sum; } int main() { cin >> z; for (int i = 0; i < z; i++) { cin >> T >> N; b[i] = acc(T,N); } for (int i = 0; i < z; i++) { printf("%.2lf\n", b[i]); } return 0; }

    核心代码:

    for (int i = 0; i < N; i++) { if (T - a[i].w > -0.0001)//因为数据类型为double { T -= a[i].w; sum += a[i].v; } else { sum += T * a[i].p;//分割金币,为代码核心点 break; } }
    Processed: 0.011, SQL: 9