题目&思路:
代码:
import java.util.ArrayList;
import java.util.Scanner;
public class KnapsackProblem {
public static void main(String[] args) {
class Item{
public int value, weight;
Item(){}
Item(int value, int weight){
this.value = value;
this.weight = weight;
}
}
Scanner cin = new Scanner(System.in);
int N = cin.nextInt();
int W = cin.nextInt();
int C[][] = new int[N+1][W+1];
ArrayList<Item> items = new ArrayList();
//items动态数组的初始化
for (int i = 0;i<=N;i++){
if(i==0){
Item e = new Item(0, 0);
items.add(e);
}
else {
int v = cin.nextInt();
int w = cin.nextInt();
Item e = new Item(v, w);
items.add(e);
}
}
for (int w=1;w<=W;w++){
for (int i=1;i<=N;i++){
if(w-items.get(i).weight<0){
C[i][w] = C[i-1][w];
}
else {
C[i][w] = Math.max(C[i-1][w], C[i][w-items.get(i).weight]+items.get(i).value);
}
}
}
int max_value = 0;
for (int i=1;i<=N;i++){
if (max_value<C[i][W]){
max_value = C[i][W];
}
}
System.out.println(max_value);
}
}
输入:
4 5
4 2
5 2
2 1
8 3
输出:
13