我遇到了编写动态算法来解决硬币更改问题的问题,我得到的是:
arr [value] - 一个填充0的全局数组,是我要解决的值的长度;
a [n] - 具有硬币值的数组;
void dynamic(int n, int *a, int value) {
arr[0]=0;
for(int i=1;i<value;i++){;
for(int j=0;j<n;j++){
if(i==arr[j]) arr[i]=1;
else{
arr[i] = arr[i-1] + 1;
}
}
}}
我知道我想怎么做但是,我不知道如何实现它。
例:
假设我有硬币1 4 10 15 40和值37来解决。我这样填写:
如果硬币值=我做arr [i] = 1;对于下一个元素,只要我低于下一个硬币,我把前一个值+ 1,arr [i-1] + 1 所以这应该填充arr [i]像这样1 = 1,2 = 2,3 = 3,4 = 1,5 = 2等等但是我错过了一些东西而且不知道如何填写它的方式我想要。
有人可以按照我想要的方式帮忙吗?我一直试图找出它,但我发现的一切都是正确的。我甚至使用递归编写了整个算法,但它太慢了,所以我需要重新编写它。
答案 0 :(得分:0)
你可能想要:
memset(arr,0,sizeof(arr));
arr[0]=1;
for(int i=0;i<n;++i)
for(int j=a[i];j<value;++j)
arr[j]+=arr[j-a[i]];
如果我理解你的话,这应该是正确的,基本上它是实现递归的一个巧妙的技巧......
f[i,j]=f[i-1,j]+f[i-1,j-a[i]];
显然这需要O(n Value)
时间。