利用窮舉法解決01揹包問題
阿新 • • 發佈:2018-12-31
01揹包動態規劃演算法可能有很多人不理解,貼出一個利用遞迴窮舉法解決01揹包問題的程式碼
package homework;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
* Created by fushuang on 2016/8/15.
*/
public class bahe {
public static int jishu=0;
//如果用例為4 6 6 5 3 jishu輸出的值為16哦~ 最後func生成的結果卻是隻有12次,但是四組3個數的比一次,然後再每組的冠軍有進行了一次比較
//程式碼思路,遞迴每次將一個人放入第一組,最後得出的結果為4 *3種結果,也就值最終返回fanc具體數值的個數,
//12個數分為四組 每三個和max比較
//12 + 4 一共為16次
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int count=scanner.nextInt();
int sum=0;
ArrayList<Integer> list = new ArrayList<>();
ArrayList<Integer> firstlist = new ArrayList<>();
for (int i = 0; i <count ; i++) {
int a=scanner.nextInt();
list.add(i,a);
sum=sum+a;
}
System.out.println(list);
sum=sum/2;
count=count/2;
System.out.println("第一隊與平均值之間的差值:"+func(list, sum, count, firstlist));
System.out.println("第一隊的人為" +firstlist);
list.removeAll(firstlist);
System.out.println("第二隊的人為"+ list);
System.out.println(jishu);
}
public static int func(List<Integer> list,int sum,int count,List<Integer> firstlist){
ArrayList<Integer> finallist=new ArrayList<>();
if (firstlist.size()==count){
int first_sum=0;
for (Integer a : firstlist) {
first_sum=first_sum+a;
}
return Math.abs(first_sum-sum);
}else {
int min=Integer.MAX_VALUE;
for (int i = 0; i < list.size(); i++) {
ArrayList<Integer> templist = new ArrayList<>(list);
ArrayList<Integer> ftemlist = new ArrayList<>(firstlist);
ftemlist.add(templist.remove(i));
int func = func(templist, sum, count, ftemlist);
jishu++;
if (func<min){
min=func;
finallist.clear();
finallist.addAll(ftemlist);
}
}
firstlist.clear();
firstlist.addAll(finallist);
return min;
}
}
}