- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
java解法
该问题与背包问题类似。给定一个预算 bud 和商品的价格列表 pri,要求我们在这个预算内尽可能购买更多的商品,使得购买的商品的总价值最大。
每个商品只能买一次,每个商品的价格固定,我们需要决定如何分配预算以实现最大化价值。
动态规划思想:
使用动态规划(Dynamic Programming, DP)来解决这个问题。
设 dp[j] 为预算 j 时,能够获得的最大价值。
初始时,dp[0] = 0,表示没有预算时最大价值为0。
对于每个商品,如果当前预算 j 大于等于该商品的价格 i,则可以选择购买该商品,并更新 dp[j] 为:
dp[j]=max(dp[j],dp[j−i]+pri[i−1])
最终,dp[bud] 就是给定预算 bud 下能够获得的最大价值。
代码流程:
读取输入:读取预算和商品价格列表。
动态规划计算最大价值:根据动态规划方法更新 dp 数组。
输出结果:输出在给定预算下的最大值。
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int bud = Integer.parseInt(in.nextLine());
Integer[] pri = Arrays.stream(in.nextLine().split(" ")).map(Integer::parseInt).toArray(Integer[]::new);
System.out.println(calcMax(bud, pri));
}
public static int calcMax(int bud, Integer[] pri) {
int[] dp = new int[bud + 1];
int i = 1;
while (i <= pri.length) {
int j = 0;
while (j <= bud) {
if (j >= i) {
dp[j] = Math.max(dp[j], dp[j - i] + pri[i - 1]);
}
j++;
}
i++;
}
return dp[bud];
}
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
评论记录:
回复评论: