子集和是否存在问题的动态规划和递归解

问题描述:

给定一个整数的集合S,给定一个整数V,确定是否存在集合S的子集且元素之和等于V子集;


解法:

代码如下:

#ifndef _SUBSET_SUM_H_
#define _SUBSET_SUM_H_


/*
* The solution of recursive  for the sum of subset
*
*/
bool  FindSubsetSumRecur( int item[], int size, int cur, int sum )
{
	if( 0 == sum )
		return true;

	if( sum < 0 || cur >= size )
		return false;

	return FindSubsetSumRecur( item, size, cur + 1, sum - item[cur] ) ||
		   FindSubsetSumRecur( item, size, cur + 1, sum );
}




/*
* The solution of dynamic program for the sum of subset
*
*/
bool FindSubsetSumDP( int item[], int size, int sum )
{
	bool** table = new bool*[sum + 1];
	assert( table );
	for( int i = 0; i <= sum; i++ )
	{
		table[i] = new bool[ size + 1];
		assert( table[i] );
	}

	table[0][0] = true;
	for( int i = 1; i <= sum; i++ )
		table[i][0] = false;

	for( int i = 1; i < size; i++ )
		table[0][0] = true;

	for( int i = 1; i <= sum; i++ )
	{
		for( int j = 1; j <= size; j++ )
		{
			if( i >= item[j - 1] )
			{
				table[i][j] = table[i - item[j-1]][j-1] || table[i][j-1];
			}
			else
			{
				table[i][j] = table[i][j-1];
			}
		}
	}

	bool res = table[sum][size];

	for( int i = 1; i <= sum; i++ )
	{
		delete [] table[i];
	}

	delete [] table;

	return res;
}


/*
* Test program
*
*/
void TestSubsetSum()
{
	const int maxLen = 1000;
	int item[maxLen];
	for( int i = 0; i < maxLen; i++ )
		item[i] = i+ 1;

	int sum = 288888;
	bool isExist = FindSubsetSumRecur( item, maxLen, 0, sum );
	bool isExistDP = FindSubsetSumDP( item, maxLen, sum );
}


#endif 
test and compile in visual studio 2005 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值