【发布时间】:2021-08-28 02:33:56
【问题描述】:
给定一个由N 非负整数组成的数组和一个target 和,检查是否可以通过选择数组中的一些元素并将它们相加来获得target。 (一个元素可以多次选择)。
我试图想出一个强力递归解决方案。我的想法是,对于每个元素,我们有 3 个选择
- 包含元素并保持在同一个索引中
- 包含元素并移动到下一个索引
- 排除元素并移动到下一个索引
这是我的 C++ 代码
bool checkSum(vector<int> &arr,int i, int n, int target)
{
if(target==0)
return true;
if(i>=n or target<0)
return false;
return (checkSum(arr, i+1, n, target) or // don't include current value and move to next
checkSum(arr, i, n, target-arr[i]) or // include current value
checkSum(arr, i+1, n, target-arr[i])); // include current value and move to next
}
对于某些测试用例,此代码似乎失败
arr = [10,7,0,6,2,6] target = 11
我无法找出问题所在。
驱动程序代码
int main()
{
int n, target;
cin >> n >> target;
vector<int> arr(n);
for (int i = 0; i < n; i++)
cin >> arr[i];
if (checkSum(arr, 0, n, target))
cout << "YES\n";
else
cout << "NO\n";
return 0;
}
PS:我不是在寻找动态编程解决方案,因为我只想先把我的基础打好。如果我能知道我在这段代码中遗漏了什么,那就太好了。
【问题讨论】:
-
您是否尝试过使用调试器?请出示minimal reproducible example
-
如何检查 (target % current sum == 0)
-
定义“失败”。它提出了正确的答案吗?会挂吗?您是否尝试过在每次调用
checkSum()时打印一些内容,以便查看您所走的阵列路径?
标签: c++ arrays algorithm recursion