01リュックサック問題(遡及法実現、java)



で二日間勉強した遡及アルゴリズムについて、先生は私達に遡って01リュックサック問題を解決させます。
数日間の改訂と増増を経て、ついに成功しました。
自己の感覚はアルゴリズムの思想を遡って、左から右へ、一歩ずつ、歩けば歩いていけます。
以下は直接コードを貼ります。コードに詳しくコメントしてください。
import java.util.Arrays;

/**
 *     01  
 * 
 * @author anLA
 *
 */
public class BagFBack {

	private MyElement[] myelements; //      
	private float s; //     
	private float nowWeight = 0; //         
	private float nowPrice = 0; //         
	private float betterValue; //        

	/*
	 *     ,         
	 */
	public BagFBack(float[] w, float[] v, float s) {
		myelements = new MyElement[w.length];
		for (int i = 0; i < w.length; i++) {
			myelements[i] = new MyElement();
			myelements[i].v = v[i];
			myelements[i].w = w[i];

		}
		this.s = s;
		//          ,         ,   MyElement  ,       
		Arrays.sort(myelements);
		System.out.println("    " + "	" + "    ");
		for (int i = 0; i < myelements.length; i++) {
			System.out.print(myelements[i].v + "	" + myelements[i].w);
			System.out.println();

		}

	}

	public void traceBack(int t) {
		if (t >= myelements.length) {
			//          ,       
			System.out.println("    ");
			betterValue = nowPrice;
			System.out.println("    : " + betterValue);
			output(myelements);
			return;
		}
		//         
		if (nowWeight + myelements[t].w < s) {
			//      
			nowWeight += myelements[t].w;
			nowPrice += myelements[t].v;
			myelements[t].take = true;
			traceBack(t + 1);
			//     
			nowWeight -= myelements[t].w;
			nowPrice -= myelements[t].v;
			myelements[t].take = false;
		}

		//      ,        
		if (bound(t + 1) > betterValue) {
			traceBack(t + 1);
		}

	}

	//     ,    
	public void output(MyElement[] myelements2) {
		System.out.print("         :");
		for (int i = 0; i < myelements2.length; i++) {
			if (myelements2[i].take) {
				System.out.print(myelements2[i].w + "	");
			}

		}
	}

	/**
	 *        ,      ,     
	 * 
	 * @param i
	 * @return
	 */
	public float bound(int i) {
		//     
		float cleft = s - nowWeight;
		float bound = nowPrice;
		//                
		while (i < myelements.length && cleft > myelements[i].v) {
			cleft -= myelements[i].w;
			bound += myelements[i].v;
			i++;
			myelements[i].take = true;
		}

		// //              ,      ,     01  ,   ,    ,        
		// if (i < myelements.length) {
		// bound += (myelements[i].v / myelements[i].w) * cleft;
		// }
		return bound;

	}

	/**
	 *        
	 * 
	 * @author anLA
	 *
	 */
	class MyElement implements Comparable {
		float w;
		float v;
		boolean take = false;

		//        ,        
		@Override
		public int compareTo(Object o) {
			if (v / w < ((MyElement) o).v / ((MyElement) o).w) {
				return 1; //   ,        ,      ,     
			} else {
				return -1;
			}
		}
	}

	public static void main(String[] args) {

		float[] w = { 3.4f, 2.5f, 6f, 4f, 9.0f };
		float[] v = { 3f, 2.5f, 5f, 9f, 6.2f };
		float s = 10;
		BagFBack bagFBack = new BagFBack(w, v, s);
		//   0     
		bagFBack.traceBack(0);
	}

}