问题描述:
给定一个整数的集合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