您的位置:首页 > 其它

51nod 1413 权势二进制 背包dp

2016-10-25 20:16 190 查看
1413 权势二进制


题目来源: CodeForces
基准时间限制:1 秒 空间限制:131072 KB

一个十进制整数被叫做权势二进制,当他的十进制表示的时候只由0或1组成。例如0,1,101,110011都是权势二进制而2,12,900不是。

当给定一个n的时候,计算一下最少要多少个权势二进制相加才能得到n。

Input
单组测试数据。
第一行给出一个整数n (1<=n<=1,000,000)

Output
输出答案占一行。

Input示例
9

Output示例
9
思路:完全背包刚刚装满背包;


#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pi (4*atan(1.0))
#define eps 1e-14
const int N=2e5+10,M=1e6+10,inf=1e9+10,mod=1e9+7;
const ll INF=1e18+10;
int a
;
int check(int x)
{
while(x)
{
if(x%10!=0&&x%10!=1)
return 0;
x/=10;
}
return 1;
}
int dp[M];
int main()
{
int flag=0;
for(int i=1;i<=1000000;i++)
if(check(i))
a[flag++]=i;
int n;
scanf("%d",&n);
for(int i=0;i<=n;i++)
dp[i]=inf;
dp[0]=0;
for(int i=0;i<flag;i++)
{
for(int t=a[i];t<=n;t++)
{
dp[t]=min(dp[t],dp[t-a[i]]+1);
}
}
printf("%d\n",dp
);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: