1.能否划分成2个相等和的子数组,转化为0-1背包问题,何为sum/2,二重循环从大到小遍历
#include <stdio.h>
#include <iostream>
#include<vector>
using namespace std;
bool canPartion(vector<int>nums) {
int sum = 0;
for (int i = 0; i < nums.size(); i++) {
sum += nums[i];
}
if (sum % 2 == 1) {
return false;
}
int target = sum / 2;
vector<int> dp(target + 1, 0);
for (int i = 0; i < nums.size(); i++) {
for (int j = target; j >= nums[i]; j--) {
dp[j] = max(dp[j], dp[j-nums[i]] + nums[i]);
}
}
std::cout << dp[target] << " " << target << endl;
return dp[target] == target;
}
int main()
{
vector<int> nums = {1, 5, 11, 5};
cout << canPartion(nums) << endl;
return 0;
}
2。能否划分成k个和相同数组,直接递归
#include <stdio.h>
#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
bool dfs(vector<int> &nums, vector<int> &visited, int start, int k, int cur_sum, int target) {
if (k == 1) return true;
if (target < cur_sum) return false;
if (target == cur_sum) return dfs(nums, visited, 0, k - 1, 0, target);
for (int i = start; i < nums.size(); i++) {
if (visited[i]) continue;
visited[i] = 1;
if(dfs(nums, visited, i + 1, k, cur_sum + nums[i], target)) {
return true;
}
visited[i] = 0;
}
return false;
}
int main()
{
vector<int> nums = {4, 3, 2, 3, 5, 2, 1};
int sum = 0;
for (auto num : nums) {
sum += num;
}
int k = 4;
if (sum % k !=0 ) {
cout <<"error" <<endl;
return 0;
}
std::sort(nums.begin(), nums.end(), greater<int>());
vector<int> visited(nums.size(), 0);
cout << dfs(nums, visited, 0, k, 0, sum / k) << " " << sum / k <<endl;
return 0;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。