码迷,mamicode.com
首页 > 其他好文 > 详细

二进制的难题 51Nod - 1413

时间:2017-09-05 13:24:05      阅读:103      评论:0      收藏:0      [点我收藏+]

标签:span   计算   思路   nbsp   输出   const   put   组成   font   

一个十进制整数被叫做权势二进制,当他的十进制表示的时候只由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

解题思路:先将范围内的所以权势二进制储存,在进行0/1背包;

代码:
#include <iostream>

using namespace std;

const int MAX = 1000009;
int a[1000];
int dp[MAX];
int ai;

void DP(int x)
{
    if(x>1000000)
        return;
    a[ai++] = x;
    DP(x*10+1);
    DP(x*10);
    return;
}

int main()
{
    a[0] = 0;
    ai = 1;
    DP(1);
    int x;
    cin>>x;
    for(int i =0;i<MAX;i++)
        dp[i] = MAX;
    dp[0] = 0;

   

    for(int i =1;i<ai;i++)
    {
        if(a[i]<=x)
        {
            for(int j = a[i];j<=x;j++ )
                if(dp[j-a[i]]<MAX)
                dp[j] = min(dp[j],dp[j-a[i]]+1);
        }
    }

    cout<<dp[x]<<endl;

    return 0;
}

 



二进制的难题 51Nod - 1413

标签:span   计算   思路   nbsp   输出   const   put   组成   font   

原文地址:http://www.cnblogs.com/a2985812043/p/7478109.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!