背包问题,水过。。。。。
#include<cstdio>
#include<algorithm>
#include<cstring>
bool dp[200][100000];
int a[200][200];
int n,maxh=0;
using namespace std;
void work(int m)
{
for(int i=1;i<=a[m][0];i++)
for(int j=maxh;j>=dp[m][i];j--)
dp[m][j]=dp[m][j]|dp[m][j-a[m][i]];
}
bool check(int h)
{
for(int i=1;i<=n;i++)
if(dp[i][h]==false)
return false;
return true;
}
int main()
{
memset(a,0,sizeof(a));
memset(dp,0,sizeof(dp));
dp[0][0]=true;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int x=0,sum=0;
dp[i][0]=true;
while(x!=-1)
{
scanf("%d",&x);
a[i][++a[i][0]]=x;
sum+=x;
}
maxh=max(maxh,++sum);
--a[i][0];
}
for(int i=1;i<=n;i++)
work(i);
for(int i=maxh;i>0;i--)
if(check(i))
{
printf("%d",i);
return 0;
}
printf("%d",0);
}