1056: 背包2(填满型01背包)

来源:互联网 发布:seo黑帽很花钱吗 编辑:程序博客网 时间:2024/06/16 19:33

时间限制: 1 Sec 内存限制: 128 MB
提交: 638 解决: 353
[提交][状态][讨论版]
题目描述

【问题描述】

有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,l,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;    } 
阅读全文
0 0
原创粉丝点击