分组背包
问题描述
有若干件物品,取一个物品需要付出的代价是weight[ i ],价值为value[ i ]。物品被分为 k 组,每组只能选取一个物品。现有一个容量为W的背包,问如何选取物品放入背包,使得背包内物品的总价值最大。
分析
状态转移方程
sum[k][j]=max{sum[k-1][j],sum[k-1][j-weight[i]]+value[i]|物品i属于第k组}
sum[ k ][ j ]表示前 k 组物品在背包容量为 j 时所能获得的最大价值
同样的这里的二维数组也可以转化为一维数组
输入格式
1,第一行给出两个整数 k 和 W 用空格分开分别代表物品组数和背包容量
2,随后给出 k 组数据
每组第一行整数 temp 表示该组有多少个物品
后面 temp 行表示物品重量和价值
如:
3 5
2
1 2
2 4
1
3 4
1
4 5
代码
import java.util.Scanner;
public class BackPack05 {
//分组背包(输入)
static int N=110;
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int k=s.nextInt();//组数
int W=s.nextInt();//背包容量
int weight[] = new int[N];//物品重量
int value[] = new int[N];//物品价值
int sum[] = new int[N];
for(int i=0;i<k;i++) {
int temp = s.nextInt();
for(int j=0;j<temp;j++) {
weight[j]=s.nextInt();//第i组的物品重量
value[j] =s.nextInt();//第i组的物品价值
}
for(int t=W;t>=0;t--) {
for(int j=0;j<temp;j++) {
if(t>=weight[j]) {
sum[t] = Math.max(sum[t], sum[t-weight[j]]+value[j]);
}
}
}
}
System.out.println(sum[W]);
}
}
输出
8