【发布时间】:2021-10-31 21:21:42
【问题描述】:
问题陈述:给定一个整数列表 (nums) 和一个整数 x,检查列表中的某些(可能是所有)元素是否在添加时给出 x。
解决方案:
int dp[20001];
int recurse(vector<int>& nums, int x, int i) {
if (x == 0)
return 1;
if (i < 0 or x < 0)
return 0;
if (dp[x] != -1)
return dp[x];
return dp[x] = recurse(nums, x - nums[i], i - 1) or recurse(nums, x, i - 1);
}
bool canPartition(vector<int>& nums, int x) {
memset(dp, -1, sizeof dp);
return recurse(nums, x, nums.size() - 1);
}
问题出在最后一行。如果我更改递归的顺序,即首先 recurse(nums, x, i - 1) 然后 recurse(nums, x - nums[i], i - 1),我会得到错误的结果。 例如,[1, 2, 3, 4, 5, 6, 7] -> 错误
我猜这与将明显错误的值放入 dp 数组有关,然后再次查找时返回相同的值。但请进一步澄清。看不透。
PS:dp数组的所有元素最初都是-1。
【问题讨论】:
标签: c++ algorithm dynamic-programming