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];
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
2022-07-18 mysql字符串函数详解
2022-07-18 mysql中的行转列,列转行
2021-07-18 IDEA git 切换分支注意事项