51nod 1413 权势二进制 背包dp
一个十进制整数被叫做权势二进制,当他的十进制表示的时候只由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[N]; 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[n]); return 0; }