用c++写代码 acm模式 输入n个整数 如果能分成相等的两份 就返回true 否则返回false
时间: 2023-05-26 13:05:00 浏览: 55
以下是使用 C 语言对此问题的解决方案:
```
#include <stdio.h>
#include <stdbool.h>
bool canPartition(int arr[], int n) {
int sum = 0;
for (int i = 0; i < n; i++) {
sum += arr[i];
}
if (sum % 2 != 0) {
return false;
}
int target = sum / 2;
bool dp[target + 1];
for (int i = 0; i <= target; i++) {
dp[i] = false;
}
dp[0] = true;
for (int i = 0; i < n; i++) {
for (int j = target; j >= arr[i]; j--) {
dp[j] = dp[j] || dp[j - arr[i]];
}
}
return dp[target];
}
int main() {
int n;
printf("请输入 n 的值:");
scanf("%d", &n);
int arr[n];
printf("请输入 %d 个整数:", n);
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
if (canPartition(arr, n)) {
printf("可以分成相等的两份。\n");
} else {
printf("无法分成相等的两份。\n");
}
return 0;
}
```
解释:
1. 首先,我们计算所有输入整数的总和,如果总和是奇数,那么就无法将它们分成相等的两份。
2. 如果总和是偶数,则我们将计算目标和 `target = sum / 2`,目标和的值表示每一份的和应该是多少。我们可以将问题转化为寻找一组数的和等于目标和的问题。
3. 我们使用动态规划来解决这个问题。创建一个布尔类型的数组 `dp`,`dp[j]` 表示是否可以通过一些输入数的组合得到和为 `j`。
4. 初始化数组 `dp` 的第一个元素为 `true`,其余元素为 `false`。
5. 对于每个输入数 `arr[i]`,我们从 `target` 开始递减地遍历 `dp` 数组,只要当前数组元素 `dp[j]` 为 `false`,就更新它的值,使它等于 `dp[j - arr[i]]` 的值。如果 `dp[target]` 为 `true`,那么就表示可以将输入数分成相等的两份,否则就不行。
6. 最后根据判断结果输出相应的信息即可。
注:此代码使用动态规划解决了相关问题。