题目:给n种硬币,每种无限多个,问组成m最少需要多少个?

动态规划

dp[i]表示当价值为i时的数目,则dp[i]=min(dp[i-a[j]]+1,dp[i])

int solve(int a[],int n,int targetval)
{
    dp[0]=0;
    sort(a,a+n);
    for(int i=1;i<=targetval;i++)
    {
            dp[i]=maxn;
        for(int j=0;i<n;j++)
        {
            if(i>=a[j]&&dp[i]>dp[i-a[j]]+1)
            dp[i]=dp[i-a[j]]+1;
        }
    }
    if(dp[targetval]==maxn)
        return -1;
    return dp[targetval];
}