直接贴代码
/**
* 背包问题
* @author
*
*/
public class PackDemo {
/**
* V 最大容量
*
*/
public static int V = 6;
/**
* N 包个数
*/
public static int N = 3;
/**
* packs[i][0]表示物品重量
* packs[i][1]表示物品价值
* i表示第i个物品
*
*/
int[][] packs = {
{1,2},{4,2},{4,3}
};
public static void main(String[] args) {
System.out.println("0-1背包问题解:" + new PackDemo().Pack1());
System.out.println("完全背包问题解:" + new PackDemo().Pack2());
PackDemo pd = new PackDemo();
int value = pd.Pack3();
if(value == Integer.MIN_VALUE)
System.out.println("0-1背包问题解:无解" );
System.out.println("0-1背包问题解:" + new PackDemo().Pack3());
System.out.println("完全背包问题解:" + new PackDemo().Pack4());
}
/**
* 完全背包 恰好装满
* @return
*/
public int Pack4(){
/**
* F[v]含义 表示容量为v的包中在给定的物品下可以获得最大价值
*
*/
int[] F = new int[V + 1];
F[0] = 0;
for(int i = 1; i <= V; i++){
F[i] = Integer.MIN_VALUE;
}
for(int i = 0; i < N; i++){
CompletePackForTotal(F, packs[i][0], packs[i][1]);
}
return F[V];
}
private void CompletePackForTotal(int[] F, int C, int W){
for(int v = C; v <= V; v++)
F[v] = max(F[v], F[v - C] + W);
}
/**
* 01背包 恰好装满
* @return
*/
public int Pack3(){
int[] F = new int[V + 1];
F[0] = 0;
for(int i = 1; i <= V; i++){
F[i] = Integer.MIN_VALUE;
}
for(int i = 0; i < N; i++){
ZeroOnePackForTotal(F, packs[i][0], packs[i][1]);
}
return F[V];
}
private void ZeroOnePackForTotal(int[] F, int C, int W){
for(int v = V; v >= C; v--)
F[v] = max(F[v], F[v - C] + W);
}
/**
* 完全背包
* @return
*/
public int Pack2(){
/**
* F[v]含义 表示容量为v的包中在给定的物品下可以获得最大价值
*
*/
int[] F = new int[V + 1];
for(int i = 0; i <= V; i++){
F[i] = 0;
}
for(int i = 0; i < N; i++){
CompletePack(F, packs[i][0], packs[i][1]);
}
return F[V];
}
private void CompletePack(int[] F, int C, int W){
for(int v = C; v <= V; v++)
F[v] = max(F[v], F[v - C] + W);
}
/**
* 01背包
* @return
*/
public int Pack1(){
int[] F = new int[V + 1];
for(int i = 0; i <= V; i++){
F[i] = 0;
}
for(int i = 0; i < N; i++){
ZeroOnePack(F, packs[i][0], packs[i][1]);
}
return F[V];
}
private void ZeroOnePack(int[] F, int C, int W){
for(int v = V; v >= C; v--)
F[v] = max(F[v], F[v - C] + W);
}
private int max(int x, int y){
return x > y ? x : y;
}
}