这题想了半天怎么判断和为偶数时是否是好数组…我只能说01背包是在是太秀了。
01背包:体积为v时所能取得的最大价值。
当和为奇数时sum/2不存在。 ans = 0;
当和为偶数时,通过01背包判断存在时, ans = 1;
1,数组中存在奇数,则删掉这个奇数即可。
2,不存在奇数,找到所有偶数的GCD,都除以一个GCD,此时必定存在一个奇数
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int, int> P;
const int maxn = 2e5 + 10;
const int M_MAX = 50000 + 10;
const int mod = 1e9 + 7;
const LL INF = 0x3f3f3f3f;
const double eps = 1e-6;
const double pi = acos(-1);
int n;
int arr[200], dp[maxn];
int gcd(int x, int y) {
if(x < y) swap(x, y);
if(y == 0) return x;
return gcd(y, x % y);
}
int check() {
int sum = 0;
for(int i = 1; i <= n; i++) sum += arr[i];
if(sum % 2 == 1) return 1;
for(int i = 1; i <= n; i++) {
for(int j = sum / 2; j >= arr[i]; j--) {
dp[j] = max(dp[j-arr[i]] + arr[i], dp[j]);
}
}
return dp[sum/2] != sum/2;
}
void solve() {
cin >> n;
for(int i = 1; i <= n; i++) cin >> arr[i];
if(check()) cout << 0 << endl;
else {
for(int i = 1; i <= n; i++) {
if(arr[i] % 2 == 1) {
cout << 1 << endl << i << endl;
return ;
}
}
int g = gcd(arr[1], arr[2]);
for(int i = 3; i <= n; i++)
g = gcd(g, arr[i]);
for(int i = 1; i <= n; i++) {
arr[i] /= g;
if(arr[i] % 2 == 1) {
cout << 1 << endl << i << endl;
return ;
}
}
}
}
int main()
{
ios::sync_with_stdio(false);
//freopen("D:\\in.txt", "r", stdin);
solve();
return 0;
}