import java.util.Arrays;
public class test {
public static void main(String[] args) {
printPlan(new int[]{2900,1800,1800,1500, 1500,1500,1400,1300,1300,1200,1200,1200,1200,400,300,100},3000);
}
/**
* 对要求的木材长度求和sum,初始化一个标准木材的数组source,数组长度为大于sum/standard向上取整
* 对要求的木材长度排序,首先按长度从大到小从标准木材中切割(第一个for循环),第二个for循环从大到小切割剩下的木材
* 对不能切割完的木材递归切割
* @param input
* @param standard
*/
public static void printPlan(int[] input,int standard){
Arrays.sort(input);
double sum=0;
for(int i=0;i<input.length;i++){
sum += input[i];
}
System.out.println("木材长度和:"+sum);
int initial = (int)Math.ceil(sum/standard);
System.out.println("共需要木材:"+initial+"根");
int[] source = new int[initial];
Arrays.fill(source, standard);
int j = 0;
int[][] a = new int[initial+1][2]; //保存切割的信息数据
int[][] b = new int[initial+1][2]; //保存切割的信息数据
int[][] c = new int[initial+1][input.length]; //保存切割的信息数据
for(int i=0;i<source.length;i++){
j++;
source[i] -= input[input.length-1-i];
System.out.println("从第"+j+"根木材切割"+input[input.length-1-i]+"长度,还剩"+source[i]+"长度");
a[i][0] = j; //保存切割信息
a[i][1] = input[input.length-1-i];
input[input.length-1-i] = 0;
}
for(int i=input.length-initial-1;i>=0;i--){
for(int k=0;k<initial;k++){
if(input[i]<=source[k]){
j++;
source[k] -= input[i];
System.out.println("从第"+(k+1)+"根木材切割"+input[i]+"长度,还剩"+source[k]+"长度");
b[k][0] = k+1; //保存切割信息
b[k][1] = input[i];
input[i] = 0;
break;
}
}
}
if(j==input.length){
System.out.println("全部切割完毕!");
}else if(j<input.length){
System.out.println("还剩下"+(input.length-j)+"根木材没有切割完");
int[] left = new int[input.length-j];
int k = 0;
for(int i=0;i<input.length;i++){
if(input[i]!=0){
left[k] = input[i];
k++;
}
}
printPlan(left,standard);
}
//整理后的信息
for(int i1=0;i1<source.length;i1++){
int j1 = 0;
c[i1][j1] = a[i1][1];
for(int k1=0;k1<initial;k1++){
j1++;
if(a[i1][0]==b[k1][0]){
c[i1][j1] = b[k1][1];
}
}
}
for(int l=0;l<initial;l++){
System.out.println("从第"+(l+1)+"根木材");
for(int i2=0;i2<input.length;i2++)
if(c[l][i2]!=0){
System.out.println("切割"+c[l][i2]+"长度");
}
}
}
}
木材长度和:20600.0
共需要木材:7根
从第1根木材切割2900长度,还剩100长度
从第2根木材切割1800长度,还剩1200长度
从第3根木材切割1800长度,还剩1200长度
从第4根木材切割1500长度,还剩1500长度
从第5根木材切割1500长度,还剩1500长度
从第6根木材切割1500长度,还剩1500长度
从第7根木材切割1400长度,还剩1600长度
从第4根木材切割1300长度,还剩200长度
从第5根木材切割1300长度,还剩200长度
从第2根木材切割1200长度,还剩0长度
从第3根木材切割1200长度,还剩0长度
从第6根木材切割1200长度,还剩300长度
从第7根木材切割1200长度,还剩400长度
从第7根木材切割400长度,还剩0长度
从第6根木材切割300长度,还剩0长度
从第1根木材切割100长度,还剩0长度
全部切割完毕!
从第1根木材
切割2900长度
切割100长度
从第2根木材
切割1800长度
切割1200长度
从第3根木材
切割1800长度
切割1200长度
从第4根木材
切割1500长度
切割1300长度
从第5根木材
切割1500长度
切割1300长度
从第6根木材
切割1500长度
切割300长度
从第7根木材
切割1400长度
切割400长度
为什么整理后的输出结果不全?
代码不全的缘故吧,...............................................