题目描述:
vivo2019提前批笔试第三题:
小v负责一次活动礼品采购,每一款礼品的受欢迎程度(热度值)各不相同,现给出总金额以及各个礼品的单价
和热度值,且每个礼品只购买一个,如何购买可以使得所有礼品的总热度值最高。
输入:
第一行是一个正整数,表示总金额(不大于1000)
第二行是一个长度为n的正整数数组,表示礼品单价(n不大于100)
第三行是一个长度为n的正整数数组,表示对应礼品的热度值
输出:
一个正整数,表示可以获得的最高总热度值
样例输入:1000
200 600 100 180 300 450
6 10 3 4 5 8
样例输出:21
思路:
dp[i][j]表示用前i种单价组成金额j获得的最大热度值。
实现1:(二维dp)
private int solution(int money, int[] value, int[] hot) {
int[][] dp=new int[value.length+1][money+1];
for(int i=1;i<=value.length;i++){
for(int j=1;j<=money;j++){
dp[i][j]=dp[i-1][j];
if(j>=value[i-1]){
dp[i][j]=Math.max(dp[i-1][j], dp[i-1][j-value[i-1]]+hot[i-1]);
}
}
}
return dp[value.length][money];
}
空间优化(一维dp)
实现:
public int solution2(int money, int[] value, int[] hot) {
int[] dp=new int[money+1];
for(int i=1;i<=value.length;i++){
for(int j=money;j>=0;j--){
if(j>value[i-1]){
dp[j]=Math.max(dp[j], dp[j-value[i-1]]+hot[i-1]);
}
}
}
return dp[money];
}