题目描述
【题意】
有n个数列,每个数列各自选若干个数,使得每个数列的和一样大,并且这个和要尽量大。
【输入格式】
第一行是一个整数N(N<=100),表示一共有n个数列。
以下N行每行是一个系列非负整数,表示每个数列的数字,用-1结束。
一个数列中的数字个数不超过100个,每个数也不超过100。
【输出格式】
一个整数,表示使得每个数列的和一样大,并且这个和要尽量大的值。如果找不到合适的方案,则输出0。
【样例输入】
2
2 1 -1
3 2 1 -1
【样例输出】
3
有n个数列,每个数列各自选若干个数,使得每个数列的和一样大,并且这个和要尽量大。
【输入格式】
第一行是一个整数N(N<=100),表示一共有n个数列。
以下N行每行是一个系列非负整数,表示每个数列的数字,用-1结束。
一个数列中的数字个数不超过100个,每个数也不超过100。
【输出格式】
一个整数,表示使得每个数列的和一样大,并且这个和要尽量大的值。如果找不到合适的方案,则输出0。
【样例输入】
2
2 1 -1
3 2 1 -1
【样例输出】
3
#include<cstdio> #include<cstring> #include<iostream> #include<cmath> using namespace std; int f[111000],a[110]; int t[111000]; int main() { int n,sum; cin>>n; for(int i=1;i<=n;i++) { int x,len=0; while(scanf("%d",&x)!=EOF) { if(x==-1) break; a[++len]=x; } sum=0; memset(f,0,sizeof(f));f[0]=1; for(int j=1;j<=len;j++) { for(int k=sum;k>=0;k--) { if(f[k]==1) { f[k+a[j]]=1; sum=max(sum,k+a[j]); } } } for(int i=0;i<=sum;i++) if(f[i]==1) t[i]++; } for(int i=sum;i>=0;i--) if(t[i]==n) { printf("%d",i); return 0; } return 0; }