题目描述
为了使取钱变得困难,某家银行在一次操作中只允许其客户提取下列金额之一:
1日元(日本的货币)
6日元,62(=36)日元,63(=216)日元,…
9日元,92(=81)日元,93(=729)日元,…
总共需要多少个操作才能取出N日元?
您取的钱不能再存入银行。
约束
1≤N≤100000
N是整数。
输入
输入来自标准输入,格式如下:
N
输出
如果总共需要提取N日元,则打印x。
样例输入 Copy
127
样例输出 Copy
4
提示
By withdrawing 1 yen, 9 yen, 36(=62) yen and 81(=92) yen, we can withdraw 127 yen in four operations. 类似于:dp完全背包#include<cstdio> #include<iostream> #include<algorithm> #include<map> #include<bits/stdc++.h> using namespace std; typedef long long ll; #define INF 0x3f3f3f3f inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int dp[100010]; int a[100],p; int n; void inint(){ scanf("%d",&n); } void inint1() { 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() { inint(); inint1(); for(int i=1;i<=n;i++) dp[i]=INF; for(int i=0;i<p;i++) //硬币面值 { for(int j=a[i];j<=n;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[n]); return 0; }