【发布时间】:2021-05-30 08:19:42
【问题描述】:
在输入权重和利润处陷入无限循环 无论您输入多少输出,都不会向前移动 任何帮助,将不胜感激 下面是代码
import java.util.*;
import java.text.*;
class fracknapsack
{
public static void main(String args[])
{
Scanner sc = new Scanner(System.in);
DecimalFormat df = new DecimalFormat("##.##");
System.out.println("Enter number of elements: ");
int n = sc.nextInt();
System.out.println("Enter total mass: ");
float m = sc.nextFloat();
System.out.println("Enter weight and profit of "+n+" elements: ");
float w[] = new float[n];
float p[] = new float[n];
float r[] = new float[n];
float f[] = new float[n];
float max = (float)0;
int flag = 0;
//for(int i=0; i<n; i++)
//{
// int a = sc.nextInt();
// w[i] = (float)a;
//}
//for(int i=0; i<n; i++)
//{
// int b = sc.nextInt();
// p[i] = (float)b;
//}
for(int i=0; i<=n; i++)
{
int a = sc.nextInt();
int b = sc.nextInt();
w[i] = (float)a;
p[i] = (float)b;
r[i] = p[i]/w[i];
f[i] = (float)0;
if(p[i]>max)
{
max = p[i];
flag = i;
}
}
float tprofit = (float)0;
while(m>0)
{
if(m>max)
{
tprofit = tprofit + p[flag];
f[flag] = (float)1;
m = m - max;
}
else
{
float fraction = max/m;
tprofit = tprofit + p[flag]*fraction;
f[flag] = fraction;
max = 0;
}
float j = (float)0;
for(int i=0; i<n; i++)
{
if(j>r[i] && j<max)
{
j = r[i];
flag = i;
}
}
max = j;
}
System.out.println();
System.out.println();
System.out.println("Fraction of weights included: ");
System.out.println("Weights \t|\t Fraction");
for(int i=0; i<n; i++)
{
System.out.println(df.format(w[i])+"\t|\t"+df.format(f[i]));
}
System.out.println();
System.out.println("Total Profit = "+df.format(tprofit));
}}
我认为这应该可以正常运行,但不是。 很困惑可能是什么问题。 包含另一个 for 循环只是为了测试,问题仍然存在。
【问题讨论】:
-
调试器(或各种 System.out.println() 语句)告诉你什么?例如
m和max的值是什么,它们的行为和变化如何? -
它不前进,卡在输入重量和元素的利润。
-
那么,
n在这种情况下是什么,之后你输入了多少个整数? -
n 是数组的长度
-
我知道是什么意思,有什么价值?
标签: java eclipse output infinite knapsack-problem