打印所有的Binary Number

本文介绍了一种使用斐波那契数列进行二进制表示的方法,并通过动态规划算法解决了给定整数的所有可能表示形式的问题。文章详细解释了算法原理及其实现过程。

If the Fibonacci series is 1,2,3,5,8,13,….. then 10 can be written as 8 + 2 ==> 10010 and 17 can be written as 13 + 3 + 1 ==> 100101. Got it?? The Question was, given n, I need to get all possible representations of n in Fibonacci Binary Number System. as 10 = 8 + 2 ==> 10010 also 10 = 5 + 3 + 2 ==> 1110

这里8+2= 10,

1 2 3 5 8 13

0 1 0 0 1 -->二进制数为10010

DP来解决,复杂度O(n * n * m), m是给的数,n是小于m的fib数的个数。

sum[i][k]表示用前i个数(第i个数一定会用到),和为k的情况总数。

最后sum[i][m],  0 < i < n,的和就是总的组合数

int fun(int N)
{
	int f[10];
	f[0] = 1;
	f[1] = 2;
	for (int i = 2; i < 10; i++)
	{
		f[i] = f[i-1] + f[i-2];
	}

	int buf[10][100];

	int size = 0;
	while (f[size] < N)
	{
		size++;
	}

	memset(buf, 0, sizeof(buf));

	for (int i = 0; i < size; i++)
	{
		buf[i][f[i]] = 1;
		for (int j = 0; j < i; j++)
		{
			for (int k = 1; k <= N-f[i]; k++)
			{
				buf[i][k+f[i]] += buf[j][k];
			}
		}
	}

	int result = 0;
	for (int i = 0; i < size; i++)
	{
		result += buf[i][N];
	}

	return result;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值