【发布时间】:2020-09-04 17:56:02
【问题描述】:
硬币排问题:有一排 n 个硬币,其值为正整数 C0, C2, . . . , Cn-1, 不一定不同。目标是在初始行中没有两个相邻的硬币不能被拾取的约束下,拾取最大数量的钱。
在下面的代码中,n 是我的数组 C 的大小(或硬币数量),此代码返回值 [10, 2, 4, 6, 3, 9, 5] 的正确结果(正确的结果是 25)。但是当我为值 [3, 12, 10] 或 [3, 12, 10, 2] 运行相同的代码时,我得到了错误的结果。 (对于一组值,结果应分别为 13 和 14)。
请帮我修复我的代码。
int max(int a, int b) {
if(a > b) return a;
return b;
}
int coin_row(int[] C, int n) {
if(n==1) return C[0];
if(n==2) return max(C[0],C[1];
int F[n], i;
F[0] = 0; F[1] = C[0];
for(i = 2;i < n;i++) {
F[i] = max(C[i] + F[i-2], F[i-1]);
}
return F[n-1];
}
【问题讨论】:
-
F代表什么?如果F[i]是您只能使用第一个i+1硬币获得的最大金额,则应将F[0] = 0; F[1] = C[0];替换为F[0] = C[0]; F[1] = max(C[0], C[1]);,就像n为1 或2 时一样。
标签: c algorithm dynamic-programming