找零钱方案总数

#include<iostream>
#include<vector>

using namespace std;

int changes(int a[],int len,int value)
{
    int **dp=new int*[len+1];
    for(int i=0;i<=len;++i)
        dp[i]=new int[value+1];

    for(int i=1;i<=len;++i)
        dp[i][0]=1;

    for(int j=1;j<=value;++j)
        dp[0][j]=0;

    for(int i=1;i<=len;++i)
        for(int j=1;j<=value;++j)
        {
            if(a[i]>j)
                dp[i][j]=dp[i-1][j];
            else
            {
                dp[i][j]=dp[i][j-a[i]]+dp[i-1][j];
            }
        }

    int result=dp[len][value];

    for(int i=0;i<=len;++i)
        delete dp[i];
    delete[] dp;

    return result;
}

int Changes(int change[],int len,int value)
{
    int *dp=new int[value+1]();
    dp[0]=1;

    for(int i=1;i<=len;++i)
        for(int j=change[i];j<=value;++j)
        {
        //  dp[0]=1;
        //      if(j>change[i])
                dp[j]=dp[j-change[i]]+dp[j];
        }

    int result=dp[value];
    delete[] dp;

    return result;

}
int main()
{
    int a[]={0,1,5,10,25};
    int len=sizeof(a)/sizeof(a[0]);

    cout<<Changes(a,len,15)<<endl;

}

猜你喜欢

转载自blog.csdn.net/hueru/article/details/81348457
今日推荐