牛客网-活动礼品采购

发布时间 2023-07-18 22:01:56作者: 白露~

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];
}

}

 

3. 总结