硬币改变问题C ++

时间:2011-03-16 17:01:19

标签: c++ coin-change

我遇到了编写动态算法来解决硬币更改问题的问题,我得到的是:

  

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等等但是我错过了一些东西而且不知道如何填写它的方式我想要。

有人可以按照我想要的方式帮忙吗?我一直试图找出它,但我发现的一切都是正确的。我甚至使用递归编写了整个算法,但它太慢了,所以我需要重新编写它。

1 个答案:

答案 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)时间。