首页 > 试题广场 >

灵异背包?

[编程题]灵异背包?
  • 热度指数:169 时间限制: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。
#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)