C语言 这道题怎么做 求解

 我来答
佴蜜珠4957
2017-07-20 · 贡献了超过111个回答
知道答主
回答量:111
采纳率:0%
帮助的人:16.2万
展开全部
申请二维数组 dp[N+1][M+1]。
1. dp[0][j],0<=j<=m,表示一种题型都不选择并且竞赛总时间为 j 时最多得分,显然等于 0。
2. dp[i][0],1<=i<=n,表示只选择竞赛题型 0..i-1 并且竞赛总时间为 0 时最多得分,显然等于0。
3. dp[i][j],1<=i<=n,1<=j<=m,表示最多只选择竞赛题型 0..i-1 并且竞赛总时间为 j 时最多得分。
3.1 如果不选择第 i-1 种题型,则最多得分 dp[i][j] = dp[i-1][j]。
3.2 如果只选择 1 道第 i-1 种题型,则最多得分 dp[i][j] = 1*point[i-1] + dp[i-1][j-time[i-1]]。
3.3 如果只选择 2 道第 i-1 种题型,则最多得分 dp[i][j] = 2*point[i-1] + dp[i-1][j-2*time[i-1]]。
...
3.k+1 最多可以选择 k=j/time[i-1] 道第 i-1 种题型,则最多得分 dp[i][j] = k*point[i-1] + dp[i-1][j-k*time[i-1]]。
以上 k+1 种情况中的最大值即为 dp[i][j] 的最多得分,即 dp[i][j] = max(dp[i-1][j], 1*point[i-1] + dp[i-1][j-time[i-1]], 2*point[i-1] + dp[i-1][j-2*time[i-1]], ..., dp[i][j] = k*point[i-1] + dp[i-1][j-k*time[i-1]]), 即 dp[i][j] = max(k*point[i-1] + dp[i-1][j-k*time[i-1]]|0<=k<=j/time[i-1])。

最终 dp[N][M] 即为最多分数。
从 dp 最后一行依次往第一行即从最后一种题型开始往第0种题型求每种题型选择的题目数。

设当前行为 i,列为 j,最多分数为 p,则求出 k(0<=k<=j/time[i-1]),使得 p == k*point[i-1] + dp[i-1][j-k*time[i-1]],则 k 为第 i-1 种题型选择的题目数。令 j -= k*time[i-1],p -= k*point[i-1],后求 dp[i-1] 行即第 i-2 种题型选择的题目数。

具体代码见附件。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式