01 背包问题的另类解法

来源:互联网 发布:mac的专业图片编辑 编辑:程序博客网 时间:2024/06/10 09:08
百度百科和大部分网站的解释背包问题,
http://baike.baidu.com/view/1731915.htm


感觉时间复杂度O(m*n);
刚好又别人解看到腾讯问题的文章:
http://baike.baidu.com/view/1731915.htm
感觉背包问题可以只是求最终结果的话,可以用权重来解决;
时间复杂度O(n);


用java编写的如下代码:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;




public class Backpack {




public static void main(String[] args) {
Backpack test = new Backpack();
List<Rely> relyList = new ArrayList<Rely>();
relyList.add(test.new Rely(1, 1));
relyList.add(test.new Rely(3, 3));
relyList.add(test.new Rely(5, 3));
relyList.add(test.new Rely(10, 3));
relyList.add(test.new Rely(6, 8));
relyList.add(test.new Rely(7, 5));
relyList = test.calcWeight(relyList);
for (Rely rely : relyList) {
System.out.println(rely);
}
System.out.println("Max: "+test.anyazer(6, relyList));




}




public int anyazer(int limit, List<Rely> relyList) {
int max = 0;
int remainder;
int mark = 0;
for (Rely rely : relyList) {
if (limit / rely.engry >= 1) {
max = limit / rely.engry * rely.happiness;
remainder = limit % rely.engry;
mark += max;
if (remainder != 0) {
limit = remainder;
continue;
}
break;
}
}
return mark;




}




public List<Rely> calcWeight(List<Rely> relyList) {
List<Rely> weightList = new ArrayList<Rely>();
for (Rely rely : relyList) {
Double weight = (double) rely.happiness / (double) rely.engry;
rely.setWeight(weight);
weightList.add(rely);
}
Collections.sort(weightList, Collections.reverseOrder());




return weightList;
}




public class Rely implements Comparable<Rely> {
private int happiness;
private int engry;
private double weight;




public Rely() {




}




public Rely(int happiness, int engry) {
this.happiness = happiness;
this.engry = engry;
}




public void setWeight(double weight) {
this.weight = weight;
}




public int getHappiness() {
return this.happiness;
}




public int getEngry() {
return this.engry;
}




@Override
public String toString() {
StringBuilder strBuilder = new StringBuilder();
strBuilder.append(happiness).append("\t").append(engry)
.append("\t").append(weight);
return strBuilder.toString();
}




@Override
public int compareTo(Rely o) {
int flag;
flag = weight > o.weight ? 1 : (weight == o.weight ? 0 : -1);
if (flag == 0) {
flag = engry > o.engry ? 1 : (engry == o.engry ? 0 : -1);
}
return flag;
}




}




}