P2240 【深基12.例1】部分背包问题

#include
using namespace std;
  struct Percent {
    int m, v;
    double p;
}a[101];

//这是很关键的一个点,是使用结构体数组保存m,b和单位价值p,这样p排完序可以直接找到m
 bool cmp(Percent a, Percent b) {
     return a.p > b.p;
 }//学习点1:sort比较时的比较函数要自己设置,这样可以传进去Percent类型,而比较里面的p,这也是非常关键的一点
int main() {
    int N, bag;
    cin >> N >> bag;
    for (int i = 0; i < N; i++) {
        cin >> a[i].m >> a[i].v;
        a[i].p = (1.0 * a[i].v) / a[i].m;//每1个的重量,是多少价值
        //如何通过data数据找到对应的weight??关键就在这
        //结构体数组
        //就是结构体里面就放了m和v,不要再找数字表示索引
    }
    double sum = 0;
    sort(a, a+N,cmp);
    for (int i = 0; i < N; i++) {
        if (bag >= a[i].m) {
            bag -= a[i].m;
            sum += a[i].v;
        }
        else {
            sum += a[i].p * bag;
            break;
        }
    }
    printf("%.2lf\n", sum);
    return 0;
}

//题目不难,但有细节点

1.sort函数的使用,要自己传进去一个cmp函数,使得能通过percent类型的地址直接排序,而不是单纯对数排序

2.结构体的使用,里面类型的安排

刷题是真的难,半天想不明白,最后也是各种百度搜出来的,但还是要坚持下去啊,慢慢刷吧

你可能感兴趣的:(c++,数学建模,开发语言)