[caioj1056](相同数列问题)填满型01背包2


1056: [视频]背包2(填满型01背包)

时间限制: 1 Sec  内存限制: 128 MB
提交: 2007  解决: 949
[提交] [状态] [讨论版] [命题人:admin]

题目描述

【题意】
    有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;   
 } 
 
满堂花醉三千客,一剑霜寒十四州
原文地址:https://www.cnblogs.com/phemiku/p/11420886.html