1. 题目
读题
小V负责一次活动礼品采购,每一款礼品的受欢迎程度(热度值)各不相同,现给出总金额以及各礼品的单价和热度值,且每个礼拜只采购一个,如何购买可以使得所有礼品的总热度值最高。(背包问题)
输入:第一行是一个整数,表示总金额(不大于1000)
第二行是一个长度为n的正整数数组,表示礼品单价(n不大于100)
第三行是一个长度为n的正整数数组,表示对应的礼品热度值
考查点
背包问题
2. 解法
思路
代码逻辑
具体实现
public class GiftHot {
public static void main(String[] args) {
int m = 1000;
int[] prices = {200, 600, 100, 180, 300, 450};
int[] hots = {6, 10, 3, 4, 5, 8};
System.out.println(pack(m, prices, hots));
System.out.println(pack2(m, prices, hots));
}
public static int pack(int m, int[] prices, int[] hots) {
int n = prices.length;
int[][] dp = new int[n + 1][m + 1];
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= m; j++) {
if (j >= prices[i - 1]) {
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - prices[i - 1]] + hots[i - 1]);
} else {
dp[i][j] = dp[i - 1][j];
}
}
}
return dp[n][m];
}
public static int pack2(int m, int[] prices, int[] hots) {
int n = prices.length;
int[][] dp = new int[n + 1][m + 1];
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= m; j++) {
for (int k = 0; k * prices[i - 1] <= m; k++) {
if (k * prices[i - 1] <= j) {
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - k * prices[i - 1]] + k * hots[i - 1]);
} else {
dp[i][j] = dp[i - 1][j];
}
}
}
}
return dp[n][m];
}
}