分组背包(java实现)

分组背包

问题描述

有若干件物品,取一个物品需要付出的代价是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

你可能感兴趣的:(算法)