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;
}

浙公网安备 33010602011771号