0-1背包问题
输入:
第一行 c(背包容量) n(物品数)
第二行:重量数组[]w
第三行:价值数组[]v
输出:最大价值
input1
20 5
6 4 8 8 4
8 4 8 10 2
output1
22
input2
10 5
3 5 6 3 2
6 3 4 2 2
output2
11
input3
10 5
2 2 6 5 4
6 3 5 4 6
output3
15
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int c=sc.nextInt();
int n=sc.nextInt();
int []w=new int[n+1];
int []v=new int[n+1];
int [][]m=new int[n+1][c+1];
for (int i = 1; i <=n; i++) {//初始化w
w[i]=sc.nextInt();
}
for (int i = 1; i <=n; i++) {//初始化v
v[i]=sc.nextInt();
}
for (int j = 0; j <=c; j++) {//初始化m的最后一行
if(j<w[n]){
m[n][j]=0;
}else{
m[n][j]=v[n];
}
}
//初始化[][]m
for (int i = n-1; i >=1; i--) {
for (int j = 0; j <=c; j++) {
m[i][j]=m(m, i, j, w, v);
}
}
//找最大价值和最优解
boolean [] flag=new boolean[n+1];
for (int i = 1; i <=n-1; i++) {
if(m[i][c]==m[i+1][c]){
flag[i]=false;
}else{
flag[i]=true;
c-=w[i];
}
}
if(w[n]<=c){
flag[n]=true;
}else{
flag[n]=false;
}
int sum=0;
for (int i = 1; i < flag.length; i++) {
if(flag[i]==true){
sum+=v[i];
}
}
System.out.println(sum);//最大价值
}
public static int m(int[][]m,int i,int j,int []w,int[]v){
if(j>=w[i]){
return Math.max(m[i+1][j], m[i+1][j-w[i]]+v[i]);
}else{
return m[i+1][j];
}
}
}