lotus

贵有恒何必三更眠五更起 最无益只怕一日曝十日寒

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  1846 随笔 :: 0 文章 :: 109 评论 :: 288万 阅读

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. 总结

posted on   白露~  阅读(88)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享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 切换分支注意事项
点击右上角即可分享
微信分享提示