列表

详情


NC17871. CSL分苹果

描述

CSL手上有n个苹果,第i个苹果的量是wi,现在他想把这些苹果分给他的好朋友wavator和tokitsukaze。但是CSL为了不让他们打架,根据量决定尽量地均分成两堆分给他们。现在CSL想知道到底给每个人分多少量的苹果。

注意:苹果不能劈开来,并且如果不能正好均分,tokitsukaze小姐姐会拿到重的那一堆。

输入描述

第一行输入一个整数n(2 ≤ n ≤ 100),第二行n个整数,表示每个苹果的质量wi(1 ≤ wi ≤ 100)。

输出描述

输出两个整数,分别表示wavator和tokitsukaze得到的苹果的质量。

示例1

输入:

3
2 2 2

输出:

2 4

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 3ms, 内存消耗: 504K, 提交时间: 2023-05-14 21:41:06

#include<bits/stdc++.h>
using namespace std;
int n,a[110],dp[10010],sum=0;
int main(){
        cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i],sum+=a[i];
	for(int i=1;i<=n;i++) for(int j=sum/2;j>=a[i];j--)  dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
	cout<<dp[sum/2]<<" "<<sum-dp[sum/2];
}

C++14(g++5.4) 解法, 执行用时: 5ms, 内存消耗: 616K, 提交时间: 2020-03-23 13:29:35

#include<bits/stdc++.h>
using namespace std;
int f[10005];
int main()
{
    int n,s=0,w;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>w;
        s+=w;
        for(int j=10000;j>=w;j--)
            f[j]=max(f[j],f[j-w]+w);
    }
    cout<<f[s/2]<<' '<<s-f[s/2];
}

C++11(clang++ 3.9) 解法, 执行用时: 5ms, 内存消耗: 592K, 提交时间: 2020-02-27 23:17:29

#include<bits/stdc++.h>
using namespace std;
int n,sum;
bitset<10005> f;
int main()
{
	cin>>n;
	f[0]=1;
	for(int i=1,w;i<=n;++i)
	{
		cin>>w;
		sum+=w;
		f|=f<<w;
	}
	for(int i=sum+1>>1;;++i)
	if(f[i]==1)
	{
		cout<<sum-i<<" "<<i<<endl;
		break;
	}
	return 0;
}

Python3 解法, 执行用时: 264ms, 内存消耗: 4740K, 提交时间: 2022-10-26 20:50:42

n=int(input())
a=list(map(int,input().split()))
dp=[0]*(sum(a)+1)
for i in range(n):
	for j in range(sum(a),a[i]-1,-1):
		dp[j]=max(dp[j],dp[j-a[i]]+a[i])
print(dp[sum(a)//2],sum(a)-dp[sum(a)//2])

上一题