首页 > 试题广场 >

灵异背包?

[编程题]灵异背包?
  • 热度指数:3516 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}给定 n 个正整数 \{a_1,a_2,\dots,a_n\},你可以任选若干个放入“灵异背包”。

\hspace{15pt}要求背包内所有数之和为偶数,且在满足偶数的前提下尽可能大。若一个数也不选,则背包和为 0

\hspace{15pt}请输出可以获得的最大偶数和。

输入描述:
\hspace{15pt}第一行输入一个整数 n\left(1\leqq n\leqq 10^5\right)
\hspace{15pt}第二行输入 n 个整数 a_1,a_2,\dots,a_n\left(1\leqq a_i\leqq 2\times10^4\right)


输出描述:
\hspace{15pt}输出一个整数,表示满足条件的最大偶数和。
示例1

输入

3
2 5 6

输出

8

说明

当灵异背包里面有(2,5,6),此时总和为2+5+6=13,为奇数,不满足条件。
当灵异背包里面有(2,6),此时总和为2+6=8,为偶数,且为最大值。
示例2

输入

1
3

输出

0

说明

选择的灵异背包为空,总和为0。
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int sum = 0;
        // 标记总和的奇偶性变化(奇数次奇数元素会使总和为奇数,偶数次则为偶数)
        boolean ifOdd = false;
        // 记录数组中最小的奇数(初始值设为整数最大值)
        int minOdd = Integer.MAX_VALUE;
        
        while (n-- > 0) {
            int a = in.nextInt();
            // 如果当前元素是奇数
            if (a % 2 == 1) {
                // 切换总和的奇偶性标记(每加入一个奇数,总和奇偶性改变)
                ifOdd = !ifOdd;
                // 更新最小奇数(保留最小的奇数)
                minOdd = Math.min(a, minOdd);
            }
            sum += a;
        }
        
        // 如果总和最终为奇数(需要调整为偶数)
        if (ifOdd) {
            // 减去最小的奇数,得到最大可能的偶数和
            System.out.print(sum - minOdd);
        } else {
            // 总和已经是偶数,直接输出
            System.out.print(sum);
        }
    }
}

发表于 2025-09-03 14:54:36 回复(0)
# 定义一个整数表示可以放入背包中的整数之和
n = int(input())
# 定义一个列表用于存储整数
list1 = list(map(int, input().split()))
list1.sort()
sum1 = sum(list1)
# 要使得背包中放入的数字最多且和为偶数
# 判断将所有数字全部放入和是否为偶数,如果是则可以直接输出
if sum1 % 2 == 0:
    print(sum1)
else:
    for i in list1:
        if i % 2 != 0:
            print(sum1 - i)
            break

发表于 2025-12-21 14:32:07 回复(0)
#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n;
    while(cin >> n) {
        vector<int> intVec(n);
        for (int i = 0; i < n; i++) {
            cin >> intVec[i];
        }
        //
        int sum = 0;
        int jsNum = 0;
        int jsSum = 0;
        int minJs = 0;
        for (auto i : intVec) {
            if (i % 2 == 0) { // 偶数的加起来一定是偶数
                sum += i;
            } else {
                jsNum++;
                jsSum += i;
                if (minJs == 0) {
                    minJs = i;
                }
                minJs = minJs < i ? minJs : i;
            }
        }
        //如果是偶数个数,都相加;如果是奇数个数减去最小的奇数
        if (jsNum % 2 == 0) {
            sum += jsSum;
        } else {
            jsSum -= minJs;
            sum += jsSum;
        }
        cout << sum << endl;
    }
}

发表于 2025-12-12 15:30:48 回复(0)
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main()
{
    int n;
    cin >> n;

    vector<int>v(n+1);

    int sum=0,minod=INT_MAX,od=0;
    for(int i=0; i<n; i++)
    {
        cin>>v[i];
        sum+=v[i];
        if(v[i]%2==1)
        {
            minod=min(minod,v[i]);
            od++;
        }
    }

    if(od%2==1) //奇数个数>1  减去最小的奇数
    {
        sum-=minod;
        if(od==1 && sum==minod)
            sum=0;
    }
    cout<<sum<<endl;

   
    return 0;
}
// 64 位输出请用 printf("%lld")

发表于 2025-12-04 22:45:16 回复(0)
2个奇数可以合成1个偶数
偶数无论怎么和都是偶数
如果所有相加为奇数则减去最小的奇数 则得到最大的偶数 是偶数直接输出
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] a = new int[n+1];
        for(int i=1;i<=n;i++){
            a[i] = sc.nextInt();
        }
        int ans = 0;//答案
        int minji = Integer.MAX_VALUE;

        for(int i = 1; i <= n; i++){
            ans += a[i];
            if(a[i] % 2 != 0){
                minji = Math.min(minji, a[i]);
            }
        }
        if(ans % 2 != 0){
            System.out.println(ans - minji);
        }
        else{
            System.out.println(ans);
        }

    }
}


发表于 2025-11-20 14:40:25 回复(0)
n=int(input())
list=sorted(list(map(int,input().split())))
list_sum=sum(list)
if list_sum%2==0:
    print(list_sum)
else:
    for i in list:
        if i%2==1:
            print(list_sum-i)
            break
发表于 2025-11-18 10:42:50 回复(0)
#include <algorithm>
#include <iostream>
#include <numeric>
#include <vector>
using namespace std;

int main() {
    int n;
    cin >> n;
    int num;
    int sum = 0;
    vector<int> bag1;//存储偶数背包
    vector<int> bag2;//存储奇数背包
    while (cin >> num) {
        if (num % 2 == 0) {
            bag1.push_back(num);
        } else {
            bag2.push_back(num);
        }
    }
    //分别计算两个背包的数字之和
    int sum1 = accumulate(bag1.begin(), bag1.end(), 0);
    int sum2 = accumulate(bag2.begin(), bag2.end(), 0);

    //奇数背包为空
    if (bag2.empty()) {
        sum1 = accumulate(bag1.begin(), bag1.end(), 0);
        cout << sum1 << endl;
        return 0;
    }
    //偶数背包为空,且奇数背包只有一个
    if (bag1.empty() && bag2.size() == 1) {
        cout << 0 << endl;
        return 0;
    }

    //奇数背包不为空且数量为偶数
    if (!bag2.empty() && sum2 % 2 == 0) {
        sum = sum1 + sum2;
        cout << sum << endl;
        return 0;
    } 
    //奇数背包不为空且数量为奇数
    else if (!bag2.empty() && sum2 % 2 != 0) {
        sort(bag2.begin(), bag2.end(), [](auto & it1, auto & it2) {
            return it1 < it2;
        });
        sum = sum1 + sum2 - bag2[0];
        cout << sum << endl;
        return 0;
    }
}
// 64 位输出请用 printf("%lld")

发表于 2025-11-04 11:17:59 回复(0)
1. 偶数无脑进累加器
2. 奇数无脑进累加器
3. 维护奇数计数器
4. 维护奇数最小值
5. 如果奇数数量为奇数,从累加器中移除最小奇数
像这种只在乎最值而不在乎大小关系的题目,其实没有排序什么事
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n, sum = 0, odd_cnt = 0, odd_mini = 2e5;
    cin >> n;
    while(n--){
        int temp;
        cin >> temp;
        sum += temp;
        if(temp % 2 == 1){
            odd_mini = min(odd_mini, temp);
            odd_cnt++;
        }
    }
    if(odd_cnt % 2){
        sum -= odd_mini;
    }
    cout << sum;
    return 0;
}
// 64 位输出请用 printf("%lld")

发表于 2025-10-23 10:07:27 回复(0)
我的思路是当全部求和后为奇书时,丢弃最后一个奇书。

发表于 2025-10-08 16:49:56 回复(0)
n = int(input())
a = [int(x) for x in input().split()]
a.sort()
result = 0
if sum(a) % 2 == 0:
    print(sum(a))
else:
     for i in a:
         if i % 2 != 0:
             print(sum(a)-i)
             break
发表于 2025-10-04 10:48:25 回复(0)
#include <stdio.h>
#include <stdlib.h>

int main() {
    //1+1=2,奇数+奇数=偶数
    //2+2=4.偶数加偶数=偶数
    //3+4=7,偶数加奇数=奇数
    //所以留一个最小的奇数和一个最小的偶数。把剩下的全部加起来看奇数还是偶数,在选一个前面留好奇数或者偶数加上就行,如果选择了偶数,则加上后的结果如果是奇数那么就把剩余的那个最小奇数也加上。如果选择了奇数,则加上后的结果如果是偶数那么就把剩余的那个最小偶数也加

    //大佬的思路://求和,和为偶则为答案,为奇数减去最小的奇数。好像跟你上面的差不多,更简单了
    int min_oushu;

    int n;
    scanf("%d",&n);
    int* array=malloc(sizeof(int)*n);
    //求和
    int sum=0;
    for(int i=0;i<n;i++)
    {
        scanf("%d",&array[i]);
        //printf("%d",array[i]);
        //求和
        sum+=array[i];
    }

    //找最小的奇数
    int min_jishu=20000;
    for(int i=0;i<n;i++)
    {
        if(array[i]%2!=0&&array[i]<min_jishu){
            min_jishu=array[i];
        }
    }

    if(sum%2==0)  //是不是偶数
    {
        printf("%d",sum);
    }else {   //为奇数减去最小的奇数
        printf("%d",sum-min_jishu);
    }
    return 0;
}
发表于 2025-10-03 12:24:59 回复(0)
偶数 + 偶数 = 偶数
奇数 + 奇数 = 偶数
奇数 + 偶数 = 奇数
先把所有偶数加起来,把所有奇数放到一个数组中,从大到小排序,继续累加最大偶数个奇数。
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void async function () {
    // Write your code here
    while(line = await readline()){
        const n = Number(line);
        const nums = (await readline()).split(' ').map(Number);
        let sum = 0;
        let odds = [];
        for (let i = 0; i < n; i++) {
            if (nums[i] % 2 === 0) {
                sum += nums[i];
            } else {
                odds.push(nums[i]);
            }
        }

        if (odds.length > 1) {
            odds.sort((a, b) => b - a);
            const len = odds.length % 2 === 0 ? odds.length : odds.length-1;
            for (let i = 0; i < len; i++) {
                sum += odds[i];
            }
        }

        console.log(sum);
    }
}()




发表于 2025-09-27 15:53:48 回复(0)
import sys
inputs=[]
for line in sys.stdin:
    a = line.split()
    inputs.append(list(map(int,a)))
n=inputs[0][0]
an=inputs[1]
counts=0
j=[]
for i in range(n):
    if an[i] %2==0:
        counts+=an[i]
    else:
        j.append(an[i])

j=sorted(j,reverse=True)
se_n=len(j)//2*2
print(counts+sum(j[:se_n]))
发表于 2025-09-14 20:53:49 回复(0)
n = int(input())
a = list(map(int,input().split()))

min_ji = 2*1e4+1
summ = 0
for item in a:
    summ += item
    if item%2!=0 and item<min_ji:
        min_ji = item

if summ%2==0:
    print(summ)
else:
    print(summ-min_ji)
发表于 2025-09-07 00:25:11 回复(0)
#include <stdio.h>
#include <stdlib.h>

int cmp(const void* a, const void* b){
    int x=*(const int*)a;
    int y=*(const int*)b;
    return (y>x)-(y<x);
}

int main() {
    int n;
    scanf("%d",&n);
    int a[n];
    int ans=0, idx=0;
    for(int i=0; i<n; i++){
        int ai;
        scanf("%d",&ai);
        if(ai%2==0) ans+=ai;
        else{
            a[idx++]=ai;
        }
    }
    qsort(a,idx,sizeof(int),cmp);
    if(idx%2==1){
        for(int i=0; i<idx-1; i++){
            ans+=a[i];
        }
    }
    else if(idx!=0){
        for(int i=0; i<idx; i++){
            ans+=a[i];
        }
    }
    printf("%d",ans);
}
发表于 2025-08-26 06:59:38 回复(0)
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        ArrayList<Integer> list = new ArrayList<>();
        int n = in.nextInt();
        for (int i = 0; i < n; i++) {
            list.add(in.nextInt());
        }
        Collections.sort(list);
        int sum = 0, x = 0;
        for (Integer i : list) {
            sum += i;
        }
        for (Integer i : list) {
            if (i % 2 != 0) {
                x = i;
                break;
            }
        }

        if (sum % 2 == 0) {
            System.out.println(sum);
        } else {
            System.out.println(sum - x);
        }

    }
}

发表于 2025-08-25 20:26:43 回复(0)
#include <stdio.h>

int main() {
    int n;
    scanf("%d",&n);
    int a[n];
    int oddsum =0,oddcount =0, evensum = 0,evencount =0;
    int minodd = 19999;

    for (int i =0; i <n; i++){
        scanf("%d",&a[i]);
        if(a[i]%2 == 0){
            evencount++;
            evensum +=a[i];
        }else{
            oddcount ++;
            oddsum +=a[i];
            minodd = minodd < a[i]?minodd:a[i];
        }
    }

    if(oddcount%2==0){
        printf("%d",evensum+oddsum);
    }else if(oddcount ==1){
        printf("%d",evensum);
    }else{
        printf("%d",evensum+oddsum-minodd);
    }
    return 0;
}
发表于 2025-07-11 21:06:14 回复(0)
n = int(input().strip())
a = list(map(int,input().split()))
k = 0
sum1 = 0
m = 0
a.sort()
sum1 = sum(a)
for i in a:
    if i % 2 != 0:
        k = i
        break
if sum1 % 2 == 0:
    m = sum1
else:
    m = max(sum1 - k ,0)
print(m)
发表于 2025-06-21 20:19:17 回复(0)