题目链接
题目描述
解题思路
dp或者搜索
代码实现
01背包二维版本
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=25;
int f[N][2000];//只考虑前i个题,使用j 题目时间小于j 消耗最长时间
int s[4],res=0;
int a[N];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int T=4;
for(int i=0;i<4;i++) cin>>s[i];
while(T--)
{
int n=s[4-T-1];
int sum=0;
for(int i=1;i<=n;i++){
cin>>a[i];
sum+=a[i];
}
for(int i=1;i<=n;i++)
{
for(int j=0;j<=sum/2;j++)
{
f[i][j]=f[i-1][j];
if(j>=a[i])
f[i][j]=max(f[i][j],f[i-1][j-a[i]]+a[i]);
}
}
res+=sum-f[n][sum/2];
}
cout<<res;
return 0;
}
一维版本
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=25;
int f[2000];//只考虑前i个题,使用j 题目时间小于j 消耗最长时间
int s[4],res=0;
int a[N];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int T=4;
for(int i=0;i<4;i++) cin>>s[i];
while(T--)
{
int n=s[4-T-1];
int sum=0;
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--)
{
f[j]=max(f[j],f[j-a[i]]+a[i]);
}
}
res+=max(f[sum/2],sum-f[sum/2]);
memset(f,0,sizeof f);
}
cout<<res;
return 0;
}
搜索
#include<bits/stdc++.h>
using namespace std;
int Left,Right,minn,ans;
int s[5];
int a[21][5];
void search(int x,int y){
if(x>s[y]){
minn=min(minn,max(Left,Right));
return;
}
Left+=a[x][y];
search(x+1,y);
Left-=a[x][y];
Right+=a[x][y];
search(x+1,y);
Right-=a[x][y];//毫无技巧的搜索回溯
}
int main(){
cin>>s[1]>>s[2]>>s[3]>>s[4];
for(int i=1;i<=4;i++){//减少码量
Left=Right=0;
minn=19260817;
for(int j=1;j<=s[i];j++)
cin>>a[j][i];
search(1,i);
ans+=minn;
}
cout<<ans;
return 0;
}