完全吃饭(N背包问题)
Description
Input
Output
输出一个整数,表示你可以获得的最大的高兴值
Sample
代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int total = scanner.nextInt();
int price[] = new int[n];
int high[] = new int[n];
for(int i =0;i<n;i++){
price[i] = scanner.nextInt();
high[i] = scanner.nextInt();
}
System.out.println(process(price,high,total));
}
public static int process(int price[],int high[],int prices){
//总计happy
int dp[] = new int[prices+1];
for(int i = 0;i<price.length;i++){
for(int money = 1;money<=prices;money++){
if(money>=price[i]) {
dp[money] = Math.max(dp[money], dp[money - price[i]] + high[i]);
}
}
}
return dp[prices];
}
}
思路
使用动态规划解决
在解决问题遇到一个效率问题
使用for(int i = 0;i<price.length;i++){ for(int money = 1;money<=prices;money++){ if(money>=price[i]) { dp[money] = Math.max(dp[money], dp[money - price[i]] + high[i]); } } }
这两个在oj上跑,下面时间是上面时间开销的6倍不止
因为下面代码对for循环的money有冗余,同时还增加了一层for循环增加开销for(int money = 1;money<=prices;money++){ for(int i = 0;i<price.length;i++){ for(int num = 0;num<=money/price[i];num++){ dp[money] = Math.max(dp[money],dp[money-num*price[i]]+num*high[i]); } } }