(只是笔记而已)
有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。
第 i 件物品的体积是 vi,价值是 wi。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。
附上java代码吧
import java.util.*;
public class bag {
public static class costom{
int weight;//商品质量
int value;//商品价值
}
public static List<costom> c=new ArrayList<costom>();
public static Scanner sc= new Scanner(System.in);
public static int n;
public static int w;
public static void input(){
String str1=sc.next().toString();
String[]nums1=str1.split(",");
n=Integer.parseInt(nums1[0]);
w=Integer.parseInt(nums1[1]);
for(int i=0;i<n;i++){
costom b=new costom();
String str=sc.next().toString();
String[] nums = str.split(",") ;
b.weight=Integer.parseInt(nums[0]);
b.value=Integer.parseInt(nums[1]);
c.add(b);
}
}
public static void test(){
Iterator<costom> it = c.iterator();
while(it.hasNext()){
int s=it.next().weight;
System.out.println(s);
}
}
public static int bag01(){
int [][]aa=new int[n+1][w+1];
for(int i=1;i<=n;i++){
for(int j=1;j<=w;j++){
if(j>=c.get(i-1).weight) {
aa[i][j] = Math.max(aa[i - 1][j], aa[i - 1][j - c.get(i - 1).weight] + c.get(i - 1).value);
}
else{aa[i][j]=aa[i-1][j];}
}
}
return aa[n][w];
}
public static void main(String[]args){
input();
//test();
System.out.println(bag01());
}
}
视频教会:
01背包讲解