1. 程式人生 > >利用窮舉法解決01揹包問題

利用窮舉法解決01揹包問題

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; } } }