c语言问题的提问与解析

问题描述

小鱼儿在一次探险途中发现了一个山洞,并且在这个山洞里找到了宝藏,可是小鱼儿发现想要把宝藏全部带走是不可能的(因为他只带了一个袋子),不过很快他就发现每个宝物旁边都有几个字,上面写着宝物的体积和价值,而且这些宝物可以分割成任意大小。小鱼儿想知道如何选取宝物,才能使带走宝物的价值最大。

预置代码

输入

第一行有两个整数v和n,表示袋子的容量和宝物的数量。(0<n<=100,010000)
接下来n行每行两个整数,分别表示宝物的体积和价值。

输出

在单独的一行中输出一个数,表示能够带走宝物的最大价值,结果保留两位小数。

输入样列

10 3
10 30
11 55
4 30

输出样例

60.00
#include
int main() {
    int v, n, k = 0;
    int  a[99], b[99];
    double r[99]={0}, he = 0, jiazhi = 0, p;
    scanf("%d %d", &v, &n);
    for (int i = 0; i < n; i++) {
        scanf("%d %d", &a[i], &b[i]);
        r[i] =  b[i] / 1.0 / a[i];
    }
    for (int i = 0; i < n - 1; i++) {
        for (int j = i+1; j < n  ; j++) {
            if (r[i] 0;i= v) {
            he = he - a[i];
            break;
        }
        k++;
        jiazhi += b[i];

    }
    p = r[k];
    printf("%.2lf", jiazhi + (v - he) * p);
    
    return 0;
}

我自己在网上搜集过样例,进入运行都是正确的,但是学习系统认为我答案有误,恳求指正。


#include <bits/stdc++.h>
using namespace std;
 
struct Node {
    int v, c;
    double rate;
} node[110];
 
bool cmp(Node a, Node b) {
    return a.rate > b.rate;
}
 
int main() {
    int n, v;
    scanf("%d %d", &v, &n);
    for (int i = 0; i < n; i++) {
        scanf("%d %d", &node[i].v, &node[i].c);
        node[i].rate = (double)node[i].c / node[i].v;
    }
    sort(node, node + n, cmp);
    int remain = v;
    double value = 0;
    for (int i = 0; i < n; i++) {
        if (remain >= node[i].v) {
            value += node[i].c;
            remain -= node[i].v;
        } else {
            value += node[i].rate * remain;
            break;
        }
    }
    printf("%.2lf\n", value);
    return 0;
}