二进制的难题 51Nod - 1413

Posted 山杉三

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二进制的难题 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

解题思路:先将范围内的所以权势二进制储存,在进行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的主要内容,如果未能解决你的问题,请参考以下文章

51nod 1413:权势二进制

51nod 1413 权势二进制 (水题)

51nod 1413 权势二进制

51NOD 1413 权势二进制(思维)

51Nod 1413 权势二进制 (思维)

51nod1413 权势二进数