51Nod - 1413 权势二进制
一个十进制整数被叫做权势二进制,当他的十进制表示的时候只由0或1组成。例如0,1,101,110011都是权势二进制而2,12,900不是。
当给定一个n的时候,计算一下最少要多少个权势二进制相加才能得到n。
Input单组测试数据。
第一行给出一个整数n (1<=n<=1,000,000)Output输出答案占一行。Sample Input
9
Sample Output
9
做法:
正解:贪心
我的写法:迭代加深搜索
暴力出奇迹啊。。。。。。
代码:
#include<iostream> using namespace std; #include<cstdio> #include<cstring> #include<vector> #include<algorithm> vector<int> b; int v[1100000]; int v2[1100000]; void dfs(int x){ if(x>1000000) return; if(v[x]) return; v[x]=1; b.push_back(x); dfs(x*10); dfs(x*10+1); } int f[1100000]; int y; int gf(int x){ if(x>y) return 0x3f3f3f3f; if(x<0) return 0x3f3f3f3f; if(x==0) return 0; if(v2[x]) return f[x]; int ans=0x3f3f3f3f; //cout<<x<<endl; v2[x]=1; for(int i=b.size()-1;i>=0;i--){ int zans; if(b[i]==0) continue; zans=gf(x-b[i])+1; if(zans<ans) ans=zans; } f[x]=ans; return f[x]; } inline int read(){ int ans=0; char c=getchar(); while(!(c>='0'&&c<='9')) c=getchar(); while((c>='0'&&c<='9')){ ans=ans*10+c-'0'; c=getchar(); } return ans; } int main(){ int n; dfs(0);dfs(1); sort(b.begin(),b.end()); n=read(); int ans=0; int zans=0; for(int i=1;;i++){ y=i; int ans=gf(n); if(ans<0x3f3f3f3f){ zans=ans; break; } } printf("%d",zans); return 0; }