经典的硬币找零问题,一开始用贪心,其实是不对的,贪心并不能保证整体最优解。需要用的动态规划!!!
#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;
}