01-背包---P2663 越越的组队
阅读原文时间:2023年07月11日阅读:1

P2663 越越的组队

是这题数据水还是。。。(数据怎么知道我人数有没有超一半啊)

简化题目:

把n个数分成两组,使得较小的一组在不超过n个数总和一半的情况下和最大

(较小的一组之和肯定不超过总和一半啊)

01背包求解,假设我们的背包里就装较小的一组数,那么每个数字都可以选或不选,但是只能用一次

f[ i ][ j ] 前 i 件物品中分数不超过 j 的最大分数

习惯降一维01背包求解,即 f [ j ] 前 i 件物品中分数不超过 j 的最大分数

#include
#include
#include
#include
#include
#include
#include
#include

using namespace std;

typedef long long ll;

inline int read()
{
int ans=;
char last=' ',ch=getchar();
while(ch<''||ch>'') last=ch,ch=getchar();
while(ch>=''&&ch<='') ans=ans*+ch-'',ch=getchar();
if(last=='-') ans=-ans;
return ans;
}

int n;
int s[];
int f[];
int ave=;

int main()
{
n=read();
for(int i=;i<=n;i++) s[i]=read(),ave+=s[i]; ave=ave/; for(int i=;i<=n;i++) for(int j=ave;j>=s[i];j--)
f[j]=max(f[j],f[j-s[i]]+s[i]);
printf("%d\n",f[ave]);

return  ;  

}

P2392 kkksc03考前临时抱佛脚

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器