java 动态规划 01背包 矩阵连乘
package sf;
import java.util.Arrays;
import java.util.Scanner;
//实验四,动态规划,0/1背包
public class knap {
public static void Knap(int v[], int w[], int c, int n, int m[][]) {
/* v是价值向量,w是质量向量,c是背包容量,n物品数量,m是最价值矩阵*/
int jMax = Math.min(w[n] - 1, c);
//对二维数组初始化
for (int j = 0; j <= jMax; j++)
m[n][j] = 0;
for (int j = w[n]; j <= c; j++)
m[n][j] = v[n];
for (int i = n - 1; i > 1; i--) {
jMax = Math.min(w[i] - 1, c); // 先确定 0<= j <w[i]时的m[i][j]
for (int j = 0; j <= jMax; j++)
m[i][j] = m[i + 1][j];
for (int j = w[i]; j <= c; j++)
m[i][j] = Math.max(m[i + 1][j], m[i + 1][j - w[i]] + v[i]);
}
m[1][c] = m[2][c]; //w[1]>c时的m[1][j]
if (c >= w[1]) //c>=w[1]时的m[1][j]
m[1][c] = Math.max(m[1][c], m[2][c - w[1]] + v[1]);
}
static void Traceback(int m[][], int w[], int c, int n, int x[]) {
for (int i = 1; i < n; ++i) {
if (m[i][c] == m[i + 1][c])
x[i] = 0;
else {
x[i] = 1;
c -= w[i];
}
}
//m[n][c]不为0,x[n]赋值1,为0,赋值0
if(m[n][c]>1) {
x[n] =1;
}
if(m[n][c]==0) {
x[n] =0;
}
}
public static void main(String[] args) {
int []w=new int[101];
int []v=new int[101];
int []x=new int[6];
int [][]m=new int[101][101];
Scanner sc=new Scanner(System.in);
System.out.println("输入背包容量:");
int c=sc.nextInt();
System.out.println("输入物品数量:");
w[0]=sc.nextInt();
v[0]=w[0];
System.out.println("输入各物质量:");
for (int i = 1; i <= w[0]; ++i) {
w[i]=sc.nextInt();
}
System.out.println("输入各物品价值:");
for (int i = 1; i <= w[0]; ++i) {
v[i]=sc.nextInt();
}
Knap(v, w, c, w[0], m);
Traceback(m, w, c, w[0], x);
//System.out.println(Arrays.toString(x));
System.out.println("选中的物品为1,未选中的为0:");
for (int i = 1; i <= w[0]; ++i) {
System.out.print(x[i]+" ");
}
System.out.println();
System.out.println("总价值为:");
System.out.println(m[1][c]);
}}
矩阵连乘