Java 使用贪心法查找最小浪费会给出错误的输出

Java 使用贪心法查找最小浪费会给出错误的输出,java,greedy,minimize,Java,Greedy,Minimize,我试图用贪婪算法解决以下问题,但没有得到正确的输出 问题是: 这里是一个示例输入: 20 7 10467694 以下是模型输出: 217 我的输出是: 343 我的算法是一段java代码,如下所示: import java.io.FileNotFoundException; import java.io.FileReader; import java.util.ArrayList; import java.util.Scanner; public class Elevate {

我试图用贪婪算法解决以下问题,但没有得到正确的输出

问题是:

这里是一个示例输入: 20 7 10467694

以下是模型输出: 217

我的输出是: 343 我的算法是一段java代码,如下所示:

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Scanner;

public class Elevate {


    public static void main(String[] args) throws FileNotFoundException {
        Scanner cin = new Scanner(new FileReader("elevate.in"));
        int N, M, Weights, waste;
        M = cin.nextInt();
        N = cin.nextInt(); 
        ArrayList<Integer> wieghts = new ArrayList<>();
        ArrayList<Integer> WT = new ArrayList<>();
        int numCase =1; 
        while(N != 0 && M != 0){
            Weights = M;
            waste = 0; 
            for (int i = 0; i < N; i++) {
                wieghts.add(cin.nextInt());
            }


            for (int i = 0; i < N; ) {
                if(wieghts.get(i) <= Weights){
                   Weights -= wieghts.get(i); 
                   i++;
                }
                else{
                    //we cannot fit more people 
                    //Start again 

                    WT.add(Weights);
                    Weights = M;
                }
            }
            for (int i = 0; i < WT.size(); i++) {
                waste+= (WT.get(i) * WT.get(i) * WT.get(i));
            }

            System.out.println(numCase +": "+waste);
            M = cin.nextInt();
            N = cin.nextInt(); 
            wieghts.clear();
            WT.clear();
            numCase++;
        }

    }

}
import java.io.FileNotFoundException;
导入java.io.FileReader;
导入java.util.ArrayList;
导入java.util.Scanner;
公共阶层提升{
公共静态void main(字符串[]args)引发FileNotFoundException{
Scanner cin=新的扫描仪(新的文件读取器(“elevate.in”);
整数N,M,重量,损耗;
M=cin.nextInt();
N=cin.nextInt();
ArrayList wieghts=新的ArrayList();
ArrayList WT=新的ArrayList();
int numCase=1;
而(N!=0&&M!=0){
重量=M;
废物=0;
对于(int i=0;i如果(wieghts.get(i)是
217
您的全部输出?不,这是模型答案我的输出是:343Hmm,问题陈述表明输出应该是
casenumber,TW
的形式,所以它不应该只是一个数字。“贪婪是一个错误的选择吗?”-我会说是的,因为结果TW是所有单个WF^3的总和。让我们假设你只得到2个WF-一个小的和一个大的可能比2个几乎相等的差(假设我们的总TF为4,那么1^3+3^3=28,而2^3+2^3=16).我想说的是,应该可以从总重量和最大容量中计算出平均WF。然后,您希望使每个WF尽可能接近该平均值。这不是问题(这可以通过一个简单的计数器解决)。我添加了完整的代码并解决了此问题。主要问题是我的算法不正确,或者样本输出不正确。
217
您的整个输出?不,这是模型答案。我的输出是:343Hmm,问题陈述表明输出的形式应该是
casenumber,TW
,因此它不应该只是一个数字。“贪婪是一个错误的选择吗?”-我会说是,因为结果TW是所有单个WF^3的总和。让我们假设你只得到2个WF-一个小的和一个大的可能比2个几乎相等的更差(假设我们的总TF为4,那么1^3+3^3=28,而2^3+2^3=16).我想说的是,应该可以从总重量和最大容量中计算出平均WF。然后,您希望使每个WF尽可能接近该平均值。这不是问题(这可以通过一个简单的计数器解决)。我添加了完整的代码并解决了此问题。主要问题是我的算法不正确或示例输出不正确