【发布时间】:2014-07-26 09:15:07
【问题描述】:
我设法编写了这段代码来找到最小的硬币总和以达到准确的价值。但我写这篇文章是考虑到硬币的正值。
有人可以告诉我如何升级此代码以计算具有负硬币值的最小硬币总和吗? 提前谢谢!
int main()
{
int arr[] = {1, 2, 3};
int m = sizeof(arr)/sizeof(arr[0]);
int n = 4;
printf(" %d ", count(arr, m, n));
return 0;
}
int count( int S[], int m, int n )
{
int i, j, x, y;
int table[n+1][m];
for (i=0; i<m; i++)
table[0][i] = 1;
// Fill rest of the table enteries in bottom up manner
for (i = 1; i < n+1; i++)
{
for (j = 0; j < m; j++)
{
// Count of solutions including S[j]
x = (i-S[j] >= 0)? table[i - S[j]][j]: 0;
// Count of solutions excluding S[j]
y = (j >= 1)? table[i][j-1]: 0;
// total count
table[i][j] = x + y;
}
}
return table[n][m-1];
}
【问题讨论】:
-
首先,您是否意识到您当前的解决方案永远不允许多次选择同一个硬币?我提到这一点是因为在用硬币找零方面陈述的问题通常使用一组硬币类型,可以根据需要多次使用,而不是一组固定的硬币.
-
其次,假设您想继续将问题视为一组硬币而不是硬币类型,我建议首先处理所有负硬币,然后“向下”构建:从概念上讲,您想为所有
min <= i < 0计算table[i][j],其中min是所有负硬币的总和。 (当然你不能索引一个带有负下标的数组,所以你需要一些其他的方案,例如一个偏移量。)然后你可以像往常一样工作。 -
什么是“负币值”?为什么在这里使用“硬币”这个词?
标签: algorithm dynamic-programming