补圣衣
补圣衣
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
****************************************************************/