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

  

posted @ 2017-11-23 14:10  晓风微微  阅读(149)  评论(0编辑  收藏  举报