LintCode刷题—— 背包问题 IX(动态规划)
问题描述
你总共有n
万元,希望申请国外的大学,要申请的话需要交一定的申请费用,给出每个大学的申请费用以及你得到这个大学offer的成功概率,大学的数量是 m
。如果经济条件允许,你可以申请多所大学。找到获得至少一份工作的最高可能性。
0<=n<=10000,0<=m<=10000
样例
样例 1:
输入:
n = 10
prices = [4,4,5]
probability = [0.1,0.2,0.3]
输出: 0.440
解释:
选择第2和第3个学校。
样例 2:
输入:
n = 10
prices = [4,5,6]
probability = [0.1,0.2,0.3]
输出: 0.370
解释:
选择第1和第3个学校。
AC代码
1 public class Solution { 2 /** 3 * @param n: Your money 4 * @param prices: Cost of each university application 5 * @param probability: Probability of getting the University's offer 6 * @return: the highest probability 7 */ 8 public double backpackIX(int n, int[] prices, double[] probability) { 9 // write your code here 10 int m = prices.length; 11 if (n == 0) { 12 return 0; 13 } 14 15 // 还是0-1背包问题 dp[i][j] 前i所学校总共j万元,获得至少一份工作的最高可能性 16 // 就是将所有的可能情况的概率都加起来就是最高可能性 17 // 滚动数组 18 double[][] dp = new double[2][n + 1]; 19 20 dp[0][0] = 0; 21 22 for (int i = 1; i <= 1; i++) { 23 dp[i][0] = 0; 24 } 25 26 for (int i = 1; i <= n; i++) { 27 dp[0][i] = 0; 28 } 29 30 int old = 0; 31 int now = 1; 32 // 这里先考虑的是学校,再考虑的是费用 33 for (int i = 1; i <= m; i++) { 34 old = now; 35 now = 1 - now; 36 for (int j = 1; j <= n; j++) { 37 if (prices[i - 1] > j) { 38 dp[now][j] = dp[old][j]; 39 } else { 40 // 选或不选比大小 41 double a = dp[old][j - prices[i - 1]] * probability[i - 1]; 42 double b = (1 - dp[old][j - prices[i - 1]]) * probability[i - 1]; 43 double c = dp[old][j - prices[i - 1]] * (1 - probability[i - 1]); 44 dp[now][j] = Math.max(dp[old][j], a + b + c); 45 } 46 } 47 } 48 49 return dp[now][n]; 50 } 51 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能