补圣衣

Description

有四个人,每人身上的衣服分别有s1,s2,s3和s4处破损,而且每处破损程度不同,破损程度用需修好它用的时间表示(A1...As1,B1...Bs2,C1...Cs3,D1...Ds4)。不过你可以同时修补2处破损。但是这2处破损,只能是同一件衣服上的。就是说你只能同时修补一件衣服,修好了,才能修补下一件。

Input

本题包含5行数据:第1行,为s1,s2,s3,s4(1≤s1,s2,s3,s4≤20) 第2行,为A1...As1 共s1个数,表示第一件衣服上每个破损修好它所需的时间 第3行,为B1...Bs2 共s2个数,表示第二件衣服上每个破损修好它所需的时间 第4行,为C1...Cs3 共s3个数,表示第三件衣服上每个破损修好它所需的时间 第5行,为D1...Ds4 共s4个数,表示第四件衣服上每个破损修好它所需的时间 (1≤A1...As1,B1...Bs2,C1...Cs3,D1...Ds4≤60)

Output

输出一行,为修好四件衣服所要的最短时间

Sample Input

1 2 1 3
5
4 3
6
2 4 3

Sample Output

20

HINT

Source

#include <bits/stdc++.h>
using namespace std;
int s[5];
bool f[1300];
int a[21];
int main()
{
    for(int i = 1;i<=4;i++)
    cin>>s[i];
    int ans=0;
    for(int _i=1;_i<=4;_i++)
    {
        memset(f,0,sizeof(f));
        int sum=0;
        for(int i=1;i<=s[_i];i++)
        {
            scanf("%d",&a[i]);
            sum+=a[i];
        }
        f[0]=1;
        for(int i=1;i<=s[_i];i++)
        {
            for(int j=sum;j>=0;j--)
            {
                if(f[j]==1)
                {
                    f[j+a[i]]=1;
                }
            }
        }
        for(int i=(sum+1)/2;i<=sum;i++)
        if(f[i]==1)
        {
            ans+=i;
            break;
        }
    }
    cout<<ans<<endl;
    return 0;
}
/**************************************************************
    Problem: 1606
    User: LJA001162
    Language: C++
    Result: 正确
    Time:0 ms
    Memory:1536 kb
****************************************************************/
01-10 01:27