题目传送门
巧妙思路:求n中所有位数上最大的一个数,原因是所有权势二进制都由0、1组成比如说9998,那么要想得到最高位的9,肯定需要9个1xxx相加。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n;
cin >> n;
int ans =0;
while (n)
{
int bns = n % 10;
if (bns > ans) ans = bns;
n = n / 10;
}
cout << ans << endl;
getchar();
getchar();
}
解法二:暴力枚举法。
#include<iostream>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 1000000;
map<int, int> map1;
vector<int> v;
int v2[1000010], f[1000010];
void dfs( int x)
{
if (x > maxn) return;//搜索的上限
else if (x < 0) return;
else if (map1[x]) return;//剪枝,加快搜索
map1[x] = 1;
v.push_back(x);
dfs(x * 10);
dfs(x * 10 + 1);
}
int _max(int x)
{
if (x < 0) return inf;
else if (x == 0) return 0;
else if (v2[x]) return f[x];
int ans = inf;
v2[x] = 1;
for (int i = v.size() - 1; i >= 0; i--)
{
if (v[i]==0) continue;
int bns;
bns = _max(x - v[i]) + 1;
if (bns < ans)
ans = bns;
}
f[x] = ans;
return f[x];
}
int main()
{
int n;
cin >> n;
dfs(0);
dfs(1);
sort(v.begin(), v.end());
int ans = _max(n);
cout << ans << endl;
getchar();
getchar();
}