链接:https://www.nowcoder.com/acm/contest/190/G
来源:牛客网
CSL分苹果
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
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
上代码:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int bag[2][10000],n,w[100],sum=0,ans,o=0;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>w[i];
sum+=w[i];
}
memset(bag[0],0,sizeof(bag[0]));
bag[1][0]=0;
for(int i=1;i<=n;i++)
{
o^=1;
for(int j=1;j<=sum/2;j++)
{
if(j>=w[i-1])
bag[o][j]=max(bag[o^1][j],bag[o^1][j-w[i-1]]+w[i-1]);
else
bag[o][j]=bag[o^1][j];
}
}
cout<<bag[o][sum/2]<<" "<<sum-bag[o][sum/2]<<endl;
}
构造背包容量为sum/2的01背包;
这里分享一种错解~~~~,下次不要采坑。。。。。
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int n,w[110],left=0,right=0;
cin>>n;
for(int i=0;i<n;i++)
cin>>w[i];
sort(w,w+n);
left=w[n-2];
right=w[n-1];
for(int i=n-3;i>=0;i--)
if(left<right)
left+=w[i];
else
right+=w[i];
cout<<left<<" "<<right<<endl;
}
大概这题就是要暴力;