C - Strange Bank(atcoder)

经典的硬币找零问题,一开始用贪心,其实是不对的,贪心并不能保证整体最优解。需要用的动态规划!!!


#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
int dp[100010];
int a[100],p;
void f()
{
    int ans=1;
    p=0;
    for(int i=1;i<=5;i++)
    {
        ans*=9;
        a[p++]=ans;
    }
    ans=1;
    for(int i=1;i<=6;i++)
    {
        ans*=6;
        a[p++]=ans;
    }
    a[p++]=1;
    sort(a,a+p);
}
int main()
{
    int t,A;
    int i,j;
    f();
    while(scanf("%d",&t)==1)
    {
        for(i=1;i<=t;i++)
            dp[i]=INF;
        for(i=0;i<p;i++)  //硬币面值
        {
            for(j=A;j<=t;j++)//dp[j]表示总数为j时所需的硬币数
                dp[j]=min(dp[j],dp[j-a[i]]+1);//dp[j-A]表示总和为j-A时,所需的硬币数,而且dp[j-A]+1也可使面值恰好为t
        }
        printf("%d\n",dp[t]);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41061455/article/details/80645042