C++OI方法编译错误,希望帮助

问题遇到的现象和发生背景

在做一道OI题目时遇到编译错误。更换编译环境得到运行时错误。在本地(Code::Blocks c++17或VS Code c++23)上均编译通过,但在OJ(C++11~17)上提交却编译错误。本地答案也不太对。
题目和样例数据如下:

题目
G. 金银岛

内存限制:256 MiB
时间限制:1000 ms
标准输入输出
题目类型:传统
评测方式:文本比较
    
题目描述
某天KID利用飞行器飞到了一个金银岛上,上面有许多珍贵的金属,KID虽然更喜欢各种宝石的艺术品,可是也不拒绝这样珍贵的金属。但是他只带着一个口袋,口袋至多只能装重量为w的物品。岛上金属有s个种类, 每种金属重量不同,分别为n1,n2,...,ns,同时每个种类的金属总的价值也不同,分别为v1,v2,...,vs。KID想一次带走价值尽可能多的金属,问他最多能带走价值多少的金属。注意到金属是可以被任意分割的,并且金属的价值和其重量成正比。

输入格式
第1行是测试数据的组数k,后面跟着k组输入。

每组测试数据占3行,第1行是一个正整数w(1≤w≤10000),表示口袋承重上限。第2行是一个正整数s(1≤s≤100),表示金属种类。第3行有2s个正整数,分别为n1,v1,n2,v2,...,ns,vs分别为第一种,第二种,第s种金属的总重量和总价值(1≤ni≤10000,1≤vi≤10000)。

输出格式
k行,每行输出对应一个输入。输出应精确到小数点后2位。

样例

样例
样例输入
2
50
4
10 100 50 30 7 34 87 100
10000
5
1 43 43 323 35 45 43 54 87 43

样例输出
171.93
508.00

本地输出答案与样例不符。

报错。报错信息较长,很抱歉,但希望各位指点。

||=== 构建文件: "无目标" 在 "无项目" 中 (编译器: 未知的) ===|


||=== 构建文件: "无目标""无项目" 中 (编译器: 未知的) ===|
C:\Users\CodeS\Desktop\test\d15test7.cpp||In function 'int main(int, char**)':|
C:\Users\CodeS\Desktop\test\d15test7.cpp|26|error: reference to 'sample' is ambiguous|
D:\CodeBlocks\MinGW\lib\gcc\x86_64-w64-mingw32\8.1.0\include\c++\bits\stl_algo.h|5813|note: candidates are: 'template<class _PopulationIterator, class _SampleIterator, class _Distance, class _UniformRandomBitGenerator> _SampleIterator std::sample(_PopulationIterator, _PopulationIterator, _SampleIterator, _Distance, _UniformRandomBitGenerator&&)'|
C:\Users\CodeS\Desktop\test\d15test7.cpp|13|note:                 'Metal sample [105]'|
C:\Users\CodeS\Desktop\test\d15test7.cpp|27|error: reference to 'sample' is ambiguous|
D:\CodeBlocks\MinGW\lib\gcc\x86_64-w64-mingw32\8.1.0\include\c++\bits\stl_algo.h|5813|note: candidates are: 'template<class _PopulationIterator, class _SampleIterator, class _Distance, class _UniformRandomBitGenerator> _SampleIterator std::sample(_PopulationIterator, _PopulationIterator, _SampleIterator, _Distance, _UniformRandomBitGenerator&&)'|
C:\Users\CodeS\Desktop\test\d15test7.cpp|13|note:                 'Metal sample [105]'|
C:\Users\CodeS\Desktop\test\d15test7.cpp|27|error: reference to 'sample' is ambiguous|
D:\CodeBlocks\MinGW\lib\gcc\x86_64-w64-mingw32\8.1.0\include\c++\bits\stl_algo.h|5813|note: candidates are: 'template<class _PopulationIterator, class _SampleIterator, class _Distance, class _UniformRandomBitGenerator> _SampleIterator std::sample(_PopulationIterator, _PopulationIterator, _SampleIterator, _Distance, _UniformRandomBitGenerator&&)'|
C:\Users\CodeS\Desktop\test\d15test7.cpp|13|note:                 'Metal sample [105]'|
C:\Users\CodeS\Desktop\test\d15test7.cpp|29|error: reference to 'sample' is ambiguous|
D:\CodeBlocks\MinGW\lib\gcc\x86_64-w64-mingw32\8.1.0\include\c++\bits\stl_algo.h|5813|note: candidates are: 'template<class _PopulationIterator, class _SampleIterator, class _Distance, class _UniformRandomBitGenerator> _SampleIterator std::sample(_PopulationIterator, _PopulationIterator, _SampleIterator, _Distance, _UniformRandomBitGenerator&&)'|
C:\Users\CodeS\Desktop\test\d15test7.cpp|13|note:                 'Metal sample [105]'|
C:\Users\CodeS\Desktop\test\d15test7.cpp|29|error: reference to 'sample' is ambiguous|
D:\CodeBlocks\MinGW\lib\gcc\x86_64-w64-mingw32\8.1.0\include\c++\bits\stl_algo.h|5813|note: candidates are: 'template<class _PopulationIterator, class _SampleIterator, class _Distance, class _UniformRandomBitGenerator> _SampleIterator std::sample(_PopulationIterator, _PopulationIterator, _SampleIterator, _Distance, _UniformRandomBitGenerator&&)'|
C:\Users\CodeS\Desktop\test\d15test7.cpp|13|note:                 'Metal sample [105]'|
C:\Users\CodeS\Desktop\test\d15test7.cpp|31|error: reference to 'sample' is ambiguous|
D:\CodeBlocks\MinGW\lib\gcc\x86_64-w64-mingw32\8.1.0\include\c++\bits\stl_algo.h|5813|note: candidates are: 'template<class _PopulationIterator, class _SampleIterator, class _Distance, class _UniformRandomBitGenerator> _SampleIterator std::sample(_PopulationIterator, _PopulationIterator, _SampleIterator, _Distance, _UniformRandomBitGenerator&&)'|
C:\Users\CodeS\Desktop\test\d15test7.cpp|13|note:                 'Metal sample [105]'|
C:\Users\CodeS\Desktop\test\d15test7.cpp|31|error: reference to 'sample' is ambiguous|
D:\CodeBlocks\MinGW\lib\gcc\x86_64-w64-mingw32\8.1.0\include\c++\bits\stl_algo.h|5813|note: candidates are: 'template<class _PopulationIterator, class _SampleIterator, class _Distance, class _UniformRandomBitGenerator> _SampleIterator std::sample(_PopulationIterator, _PopulationIterator, _SampleIterator, _Distance, _UniformRandomBitGenerator&&)'|
C:\Users\CodeS\Desktop\test\d15test7.cpp|13|note:                 'Metal sample [105]'|
C:\Users\CodeS\Desktop\test\d15test7.cpp|32|error: reference to 'sample' is ambiguous|
D:\CodeBlocks\MinGW\lib\gcc\x86_64-w64-mingw32\8.1.0\include\c++\bits\stl_algo.h|5813|note: candidates are: 'template<class _PopulationIterator, class _SampleIterator, class _Distance, class _UniformRandomBitGenerator> _SampleIterator std::sample(_PopulationIterator, _PopulationIterator, _SampleIterator, _Distance, _UniformRandomBitGenerator&&)'|
C:\Users\CodeS\Desktop\test\d15test7.cpp|13|note:                 'Metal sample [105]'|
C:\Users\CodeS\Desktop\test\d15test7.cpp|33|error: reference to 'sample' is ambiguous|
D:\CodeBlocks\MinGW\lib\gcc\x86_64-w64-mingw32\8.1.0\include\c++\bits\stl_algo.h|5813|note: candidates are: 'template<class _PopulationIterator, class _SampleIterator, class _Distance, class _UniformRandomBitGenerator> _SampleIterator std::sample(_PopulationIterator, _PopulationIterator, _SampleIterator, _Distance, _UniformRandomBitGenerator&&)'|
C:\Users\CodeS\Desktop\test\d15test7.cpp|13|note:                 'Metal sample [105]'|
C:\Users\CodeS\Desktop\test\d15test7.cpp|35|error: reference to 'sample' is ambiguous|
D:\CodeBlocks\MinGW\lib\gcc\x86_64-w64-mingw32\8.1.0\include\c++\bits\stl_algo.h|5813|note: candidates are: 'template<class _PopulationIterator, class _SampleIterator, class _Distance, class _UniformRandomBitGenerator> _SampleIterator std::sample(_PopulationIterator, _PopulationIterator, _SampleIterator, _Distance, _UniformRandomBitGenerator&&)'|
C:\Users\CodeS\Desktop\test\d15test7.cpp|13|note:                 'Metal sample [105]'|
C:\Users\CodeS\Desktop\test\d15test7.cpp|36|error: reference to 'sample' is ambiguous|
D:\CodeBlocks\MinGW\lib\gcc\x86_64-w64-mingw32\8.1.0\include\c++\bits\stl_algo.h|5813|note: candidates are: 'template<class _PopulationIterator, class _SampleIterator, class _Distance, class _UniformRandomBitGenerator> _SampleIterator std::sample(_PopulationIterator, _PopulationIterator, _SampleIterator, _Distance, _UniformRandomBitGenerator&&)'|
C:\Users\CodeS\Desktop\test\d15test7.cpp|13|note:                 'Metal sample [105]'|
C:\Users\CodeS\Desktop\test\d15test7.cpp|37|error: reference to 'sample' is ambiguous|
D:\CodeBlocks\MinGW\lib\gcc\x86_64-w64-mingw32\8.1.0\include\c++\bits\stl_algo.h|5813|note: candidates are: 'template<class _PopulationIterator, class _SampleIterator, class _Distance, class _UniformRandomBitGenerator> _SampleIterator std::sample(_PopulationIterator, _PopulationIterator, _SampleIterator, _Distance, _UniformRandomBitGenerator&&)'|
C:\Users\CodeS\Desktop\test\d15test7.cpp|13|note:                 'Metal sample [105]'|
C:\Users\CodeS\Desktop\test\d15test7.cpp|38|error: reference to 'sample' is ambiguous|
D:\CodeBlocks\MinGW\lib\gcc\x86_64-w64-mingw32\8.1.0\include\c++\bits\stl_algo.h|5813|note: candidates are: 'template<class _PopulationIterator, class _SampleIterator, class _Distance, class _UniformRandomBitGenerator> _SampleIterator std::sample(_PopulationIterator, _PopulationIterator, _SampleIterator, _Distance, _UniformRandomBitGenerator&&)'|
C:\Users\CodeS\Desktop\test\d15test7.cpp|13|note:                 'Metal sample [105]'|
C:\Users\CodeS\Desktop\test\d15test7.cpp|39|error: reference to 'sample' is ambiguous|
D:\CodeBlocks\MinGW\lib\gcc\x86_64-w64-mingw32\8.1.0\include\c++\bits\stl_algo.h|5813|note: candidates are: 'template<class _PopulationIterator, class _SampleIterator, class _Distance, class _UniformRandomBitGenerator> _SampleIterator std::sample(_PopulationIterator, _PopulationIterator, _SampleIterator, _Distance, _UniformRandomBitGenerator&&)'|
C:\Users\CodeS\Desktop\test\d15test7.cpp|13|note:                 'Metal sample [105]'|
C:\Users\CodeS\Desktop\test\d15test7.cpp|40|error: reference to 'sample' is ambiguous|
D:\CodeBlocks\MinGW\lib\gcc\x86_64-w64-mingw32\8.1.0\include\c++\bits\stl_algo.h|5813|note: candidates are: 'template<class _PopulationIterator, class _SampleIterator, class _Distance, class _UniformRandomBitGenerator> _SampleIterator std::sample(_PopulationIterator, _PopulationIterator, _SampleIterator, _Distance, _UniformRandomBitGenerator&&)'|
C:\Users\CodeS\Desktop\test\d15test7.cpp|13|note:                 'Metal sample [105]'|
C:\Users\CodeS\Desktop\test\d15test7.cpp|42|error: reference to 'sample' is ambiguous|
D:\CodeBlocks\MinGW\lib\gcc\x86_64-w64-mingw32\8.1.0\include\c++\bits\stl_algo.h|5813|note: candidates are: 'template<class _PopulationIterator, class _SampleIterator, class _Distance, class _UniformRandomBitGenerator> _SampleIterator std::sample(_PopulationIterator, _PopulationIterator, _SampleIterator, _Distance, _UniformRandomBitGenerator&&)'|
C:\Users\CodeS\Desktop\test\d15test7.cpp|13|note:                 'Metal sample [105]'|
C:\Users\CodeS\Desktop\test\d15test7.cpp|43|error: reference to 'sample' is ambiguous|
D:\CodeBlocks\MinGW\lib\gcc\x86_64-w64-mingw32\8.1.0\include\c++\bits\stl_algo.h|5813|note: candidates are: 'template<class _PopulationIterator, class _SampleIterator, class _Distance, class _UniformRandomBitGenerator> _SampleIterator std::sample(_PopulationIterator, _PopulationIterator, _SampleIterator, _Distance, _UniformRandomBitGenerator&&)'|
C:\Users\CodeS\Desktop\test\d15test7.cpp|13|note:                 'Metal sample [105]'|
C:\Users\CodeS\Desktop\test\d15test7.cpp|44|error: reference to 'sample' is ambiguous|
D:\CodeBlocks\MinGW\lib\gcc\x86_64-w64-mingw32\8.1.0\include\c++\bits\stl_algo.h|5813|note: candidates are: 'template<class _PopulationIterator, class _SampleIterator, class _Distance, class _UniformRandomBitGenerator> _SampleIterator std::sample(_PopulationIterator, _PopulationIterator, _SampleIterator, _Distance, _UniformRandomBitGenerator&&)'|
C:\Users\CodeS\Desktop\test\d15test7.cpp|13|note:                 'Metal sample [105]'|
||=== 构建 失败: 18 error(s), 0 warning(s) (0 分, 0 秒) ===|


代码
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;

const int MSTKND = 105;
double heav, mon, money;
int k, tmp = 1, s, moreSpace, mostBri;

struct Metal {
    double nAve;
    int nHea;
}sample[MSTKND];

bool cmp(Metal sample1, Metal sample2) {
    return sample1.nAve < sample2.nAve;
}

int main(int argc, char* argv[]) {
    ios::sync_with_stdio(false);
    cin >> k;
    for (int test = 0; test < k; ++test) {
        cin >> mostBri >> s;
        moreSpace = mostBri;
        for (int i = 0; i < s; ++i) {
            cin >> sample[i].nHea >> mon;
            sample[i].nAve = mon / sample[i].nHea;
        }
        sort(sample, sample + s, cmp);
        while (moreSpace >= 0) {
            money += sample[s - tmp].nAve * ((sample[s - tmp].nHea > moreSpace ?
                     sample[s - tmp].nHea % moreSpace :
                     sample[s - tmp].nHea) == 0 ?
                     moreSpace :
                     (sample[s - tmp].nHea > moreSpace ?
                     sample[s - tmp].nHea % moreSpace :
                     sample[s - tmp].nHea));
            moreSpace = moreSpace - ((sample[s - tmp].nHea > moreSpace ?
                        sample[s - tmp].nHea % moreSpace :
                        sample[s - tmp].nHea) == 0 ?
                        moreSpace :
                        (sample[s - tmp].nHea > moreSpace ?
                        sample[s - tmp].nHea % moreSpace :
                        sample[s - tmp].nHea));
            ++tmp;
        }
        cout << fixed << setprecision(2) << money << "\n";
        money = 0, tmp = 1;
    }
    return 0;
}


更换环境成功编译,运行时错误

img

解答思路
  1. 创建结构体Metal存储金属的单位价值及重量。
  2. cmp()函数对应sort()函数的cemp()部分。按价值排序。
  3. sample[]存储金属。
  4. moreSpace记录当前袋子剩余空间。
  5. while循环内moreSpace和money的三目运算符很多,主要是判断该金属是否能装满袋子,以及计算其价值。
    付费悬赏!

在你的代码基础上改了,见如下代码块

  1. 执行结果是对了,输出符合预期
  2. 编译不过的问题修改了定义Metal的方式,可以先试试看是否解决了

修改的部分加上了 ==== 的标识

#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;

const int MSTKND = 105;
double heav, mon, money;
int k, tmp = 1, s, moreSpace, mostBri;

typedef struct Metal {
    double nAve;
    int nHea;
} Metal;
//==== 解决编译的问题
Metal sample[MSTKND];

bool cmp(Metal sample1, Metal sample2) {
    return sample1.nAve < sample2.nAve;
}

int main(int argc, char* argv[]) {
    ios::sync_with_stdio(false);
    cin >> k;
    for (int test = 0; test < k; ++test) {
        cin >> mostBri >> s;
        moreSpace = mostBri;
        for (int i = 0; i < s; ++i) {
            cin >> sample[i].nHea >> mon;
            sample[i].nAve = mon / sample[i].nHea;
        }
        tmp = 1; //==== 每次执行要重新初始化tmp=1
        sort(sample, sample + s, cmp);
        while (moreSpace >= 0 && tmp <= s) {//==== 加上循环结束的条件tmp<=s
            //==== 3目运算不需要这么复杂,只要判断剩余袋子和当前金属重量就行
            //     如果剩余袋子大就取当前金属重量,如果小于就取剩余袋子的moreSpace
            money += sample[s - tmp].nAve * ((sample[s - tmp].nHea > moreSpace ?
                     moreSpace :
                     //moreSpace :
                     //sample[s - tmp].nHea) == 0 ?
                     //moreSpace :
                     //(sample[s - tmp].nHea > moreSpace ?
                     sample[s - tmp].nHea));
            moreSpace = moreSpace - (sample[s - tmp].nHea > moreSpace ?
                        moreSpace : sample[s - tmp].nHea);
            ++tmp;
        }
        cout << fixed << setprecision(2) << money << "\n";
        money = 0, tmp = 1;
    }
    return 0;
}

望采纳!!!点击回答右侧采纳即可!!
我修改你的代码,你需要在main函数中调用这个代码,它会输出结果。

#include <iostream>
#include <cstring>
using namespace std;

const int N = 110, W = 1e4+10;
int n,m;
int w[N],v[N];
int f[W];

int main(){
    int T;
    cin >> T;
    while(T--){
        memset(f,0,sizeof f);
        cin >> m >> n;
        for(int i = 1;i <= n;i ++){
            cin >> w[i] >> v[i];
        }
        for(int i = 1;i <= n;i ++){
            for(int j = m;j >= w[i];j --){
                f[j] = max(f[j],f[j-w[i]]+v[i]);
            }
        }
        cout << f[m] << endl;
    }
    return 0;
}


我这里编译是没问题的除了setprecision要用到iomanip库,其他都没问题