一、求资产包中资产最大总价值
1、问题描述
输入:资产总条数,资产种类,资产A条数 资产B条数 资产C条数,资产A价值 资产B价值 资产C价值
输出:资产包中资产最大总价值
2、示例
输入:12,3,4 5 7,500 600 800
输出:1400
3、代码
import java.util.Scanner;
public class DynamicProgramming {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
String[] strs = str.split(","); // 将输入的一行字符串,按照“,”分隔,存入字符串数组strs中
int count = Integer.parseInt(strs[0]); // 字符串数组中,第一个值表示:可容纳的资产总条数
int kinds = Integer.parseInt(strs[1]); // 字符串数组中,第二个值表示:资产种类
String[] s1 = strs[2].split(" "); // 将字符串数组中的第三个字符串,按照空格分隔,存入字符串数组s1中,表示:每种资产的条数
String[] s2 = strs[3].split(" "); // 将字符串数组中的第四个字符串,按照空格分隔,存入字符串数组s2中,表示:每种资产的价值
int[] nums = new int[s1.length + 1]; // 资产条数数组
int[] prices = new int[s1.length + 1]; // 资产价值数组
for (int i = 1; i <= s1.length; i++) {
nums[i] = Integer.parseInt(s1[i - 1]); // 将资产条数转换为整型,nums[0]表示没有资产时的条数
prices[i] = Integer.parseInt(s2[i - 1]); // 将资产价值转换为整型,prices[0]表示没有资产时的价值
}
// 动态规划算法
int[][] dp = new int[kinds + 1][count + 1]; // 创建动态规划表(即:二维数组)
// dp[i][j]:该数值表示当前资产包中剩余条数为j时,前i种资产的最佳组合所对应的价值
// i:表示当前放入的资产总种类;j:表示资产包剩余资产条数
// 填充动态规划表(注:初始化边界条件,即:i=0或j=0时,arr[i][j]=0)
for (int i = 1; i <= kinds; i++) {
for (int j = 1; j <= count; j++) {
// dp[i-1][j]:表示没装第i个商品
// dp[i-1][j-nums[i]] + prices[i-1]:表示装了第i个商品,背包容量减少nums[i],但价值增加了prices[i]
if (j < nums[i]) { // 当前资产包剩余资产条数小于该种资产的条数时,不装,此时资产包总价值与前i-1个相等
dp[i][j] = dp[i - 1][j];
} else { // 当前资产包剩余资产条数大于或等于该种资产的条数时,判断,选择最大值的情况
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - nums[i]] + prices[i]);
}
}
}
System.out.println(dp[kinds][count]); // 输出资产包中资产最大总价值
}
}