01背包---P2392 kkksc03考前临时抱佛脚

时间:2023-03-10 07:06:20
01背包---P2392 kkksc03考前临时抱佛脚

P2392 kkksc03考前临时抱佛脚

题解

01背包,类似于这道题,相似度99.999999%:

01-背包 P2663 越越的组队

一共有4科,每科的时间独立,然后每一科做一遍 P2663越越的组队,时间之和累加得到答案
考虑复习每一科的最短时间
由于可以左右脑并用,所以把题目简化一下就是把所有题目分成两组,取时间最长的一组作为答案,但是要使得时间最长的一组它的时间尽量短
我们知道两组数值越接近,肯定就是最优答案了

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue> using namespace std; typedef long long ll; inline int read()
{
int ans=;
char last=' ',ch=getchar();
while(ch<''||ch>'') last=' ',ch=getchar();
while(ch>=''&&ch<='') ans=ans*+ch-'',ch=getchar();
if(last=='-') ans=-ans;
return ans;
} int cnt[],s[];
int f[];
int ans=,tot=,ave=; int main()
{
for(int i=;i<=;i++) cnt[i]=read();
for(int t=;t<=;t++){
memset(s,,sizeof(s));
memset(f,,sizeof(f));
tot=,ave=;
for(int i=;i<=cnt[t];i++) s[i]=read(),tot+=s[i];
ave=tot/;
for(int i=;i<=cnt[t];i++)
for(int j=ave;j>=s[i];j--)
f[j]=max(f[j],f[j-s[i]]+s[i]);
ans+=(tot-f[ave]);
}
printf("%d\n",ans); return ;
}