子集合数(定长解)
用定长的方法求解:
#include<iostream>
using namespace std;
long Judge(int k,int *X,int *array)
{
int i; //判断计算函数
long s=0;
for(i=1;i<=k;i++)
if(X[i]!=0)
s+=array[i];
return s;
}
void Solution(int n,int *array,int result)
{ //子集和数问题解向量长度固定的结构
int i,j;
int *X=new int [n+1];
long sum;
i=1;
X[i]=1;
while(i>=1)
{
sum=Judge(i,X,array);
if(sum<result) //当搜索的解的和小于所给定的和数
{
if(i==n)
X[i]=0;
if(i<n)
{
i++;
X[i]=1;
}
}
if(sum==result) //当搜索的解的和等于所给定的和数
{
if(i<n)
{
i++;
X[i]=0;
}
if(i==n)
{
for(j=1;j<=n;j++)
cout<<X[j]<<" ";
cout<<endl;
X[i]=0;
}
}
if(sum>result) //当搜索的解的和大于所给定的和数
{
X[i]=0;
if(i<n)
{
i++;
X[i]=1;
}
}
if(i==n&&X[i]==0) //回溯
{
while(X[i]==0&&i>=1)
i--;
X[i]=0;
if(i>=1)
{
i++;
X[i]=1;
}
}
}
}
void main()
{
int n,i,result;
cin>>n>>result;
int *array=new int [n+1];
for(i=1;i<=n;i++)
cin>>array[i];
Solution(n,array,result);
}
using namespace std;
long Judge(int k,int *X,int *array)
{
int i; //判断计算函数
long s=0;
for(i=1;i<=k;i++)
if(X[i]!=0)
s+=array[i];
return s;
}
void Solution(int n,int *array,int result)
{ //子集和数问题解向量长度固定的结构
int i,j;
int *X=new int [n+1];
long sum;
i=1;
X[i]=1;
while(i>=1)
{
sum=Judge(i,X,array);
if(sum<result) //当搜索的解的和小于所给定的和数
{
if(i==n)
X[i]=0;
if(i<n)
{
i++;
X[i]=1;
}
}
if(sum==result) //当搜索的解的和等于所给定的和数
{
if(i<n)
{
i++;
X[i]=0;
}
if(i==n)
{
for(j=1;j<=n;j++)
cout<<X[j]<<" ";
cout<<endl;
X[i]=0;
}
}
if(sum>result) //当搜索的解的和大于所给定的和数
{
X[i]=0;
if(i<n)
{
i++;
X[i]=1;
}
}
if(i==n&&X[i]==0) //回溯
{
while(X[i]==0&&i>=1)
i--;
X[i]=0;
if(i>=1)
{
i++;
X[i]=1;
}
}
}
}
void main()
{
int n,i,result;
cin>>n>>result;
int *array=new int [n+1];
for(i=1;i<=n;i++)
cin>>array[i];
Solution(n,array,result);
}
测试数据:
5 15
3 5 7 10 12
1 1 1 0 0
1 0 0 0 1
0 1 0 1 0