我正在编写一个程序,以从数组的子集中查找给定的和是否可能。 (子集总和问题)。尽管Internet上有许多实现方式,但我选择自己编写代码。请提出适当的更正。我正在使用动态编程来做到这一点。
#include<iostream>
using namespace std;
bool subsetsum(int a[],int n,int s){
bool T[n][s];
for(int j=0;j<n;j++){
T[j][0]=true;
}
for(int k=1;k<n;k++){
T[0][k]=false;
for(int l=1;l<n;l++){
if((a[k]<s) && ((subsetsum(a,n-1,s-a[k])) || (subsetsum(a,n-1,s)))){
T[k][l]=true;
}
else{
T[k][l]=false;
}
}
}
return T[n][s];
}
int main(){
int n,s;
int a[n];
cout<<"Enter number of elements:\n";
cin>>n;
cout<<"Enter sum required\n";
cin>>s;
cout<<"Enter elements:\n";
for(int i=0;i<n;i++){
cin>>a[i];
}
cout<<subsetsum(a,n,s);
}
我获得的输出如下:
Enter number of elements:
3
Enter sum required
5
Enter elements:
1
4
2
0
我不明白为什么应该返回布尔值时得到0作为结果。
答案 0 :(得分:1)
数组声明如下:
bool T[n][s];
,返回结果为:
return T[n][s];
可能您需要执行以下操作?
return T[n-1][s-1];
C ++中的数组索引从0开始。