01リュックサック問題(遡及法実現、java)
3074 ワード
で二日間勉強した遡及アルゴリズムについて、先生は私達に遡って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);
}
}