自己百度搜的关于多重背包问题的java代码总是不合自己心意,所以自己来写一下:
多重背包问题涉及 :物品种类,背包限制,每种物品的重量,每种物品的数量,每种物品的价值。动态优化出最大价值。
贴代码(包括一维数组更新的方式,和二维dp矩阵的方式):
import java.util.Scanner;
//多重背包问题:
/*
* 输入: 2 10
1 1 1
1 1 1
输出: 结果 2
*/
public class 大疆2
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
int n = sc.nextInt();
int t = sc.nextInt();
int[] w = new int[n];
int[] v = new int[n];
int[] m = new int[n];
for(int i = 0 ; i < n ; i++) {
w[i] = sc.nextInt();
v[i] = sc.nextInt();
m[i] = sc.nextInt();
}
fun(n,t,w,v,m);
fun2D(n,t,w,v,m);
}
}
//n是种类,W是总的背包容量,w是每种商品的价格,m是每种商品有多少个,v是满意度,
public static void fun(int n,int W,int[] w, int[] v,int[] m) {
int[] dp = new int[W+1];
for(int i = 0; i < n; i++)//n是物品的种类
{
for(int k =1; k <= m[i]; k++)//m[i]记录的是第i个物品的数量
{
for(int j = W; j >= w[i]; j--)//w[i]记录的是第i个物品的重量 W是背包的总容量
{
if(j >= k*w[i]) {
dp[j] = Math.max(dp[j], dp[j - k*w[i]] + k*v[i]);//v[i]记录的是第i个物品的价值
}
}
}
}
System.out.println("结果 "+dp[W]);
}
//n是种类,W是总的背包容量,w是每种商品的价格,m是每种商品有多少个,v是满意度(价值),
public static void fun2D(int n,int W,int[] w, int[] v,int[] m) {
int[][] dp = new int[n][W+1];//dp[i][j]表示的是使用0,1,...,i种商品,在总钱数为j的情况下的最大价值。
//第一列全为0,不用再赋值
//第一行
for(int i = 1 ; i < W+1 ; i++)
for(int k = 0 ; k <= m[0] ; k++) {
if(i > k*m[0]) {
dp[0][i] = k*v[0];
}
}
//其他位置
for(int i = 1; i < n ; i++) {
for(int j = 1 ; j < W+1 ; j++) {
dp[i][j] = dp[i-1][j];
for(int k = 1 ; k <= m[i] ; k++) {
if(j >= k*w[i]) {
dp[i][j] = Math.max(dp[i][j],dp[i-1][j-k*w[i]]+k*v[i]);
}
}
}
}
System.out.println("2D的结果: "+dp[n-1][W]);
}
}