云短信平台优惠活动
知识点 哈希表Q队列数组统计贪心
时间限制: 1s 空间限制: 256MB 限定语言: 不限
题目描述:
某云短信厂商,为庆祝国庆,推出充值优惠活动
现在给出客户预算,和优惠售价序列,求最多可获得的短信总条数。
输入描述:
第一行客户预算M,其中 0<=M<=1000000
第二行给出售价表,P1,P2…Pn,其中 1<=n<=100,Pi为充值元获得的短信条数。1<Pi<=1000,1<=n<=100
输出描述:
最多获得的短信条数
示例1
输入:
6
10 20 30 40 60
输出:
70
说明:
分两次充值最优,1元、5元各充一次。总条数 10+60=70
示例2
输入:
15
10 20 30 40 60 60 70 80 90 150
输出:
210
说明:
分两次充值最优,10元、5元各充一次。总条数 150+60=210
解题思路:
- 完全背包问题
- n个物品,最大容量maxNum,可以装的最大价值
public class My {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
Integer.parseInt(str);
int maxNum = Integer.parseInt(str);
String line = sc.nextLine();
String[] strings = line.split(" ");
int n = strings.length;
//要考虑到物品0的情况,物品0的重量和价值都是0
int[] values = new int[n + 1];
for (int i = 1; i <= n; i++) {
values[i] = Integer.parseInt(strings[i - 1]);
}
int[] wight = new int[n + 1];
for (int i = 0; i < wight.length; i++) {
wight[i] = i;
}
int[][] dp = new int[n + 1][maxNum + 1];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= maxNum; j++) {
if (j < wight[i]) {
dp[i][j] = dp[i - 1][j];
}else {
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - wight[i]] + values[i]);
}
}
}
System.out.println(dp[n][maxNum]);
}
}