杭电2082

#include<stdio.h>
#include<string.h>
 
int  le[30],n1[55],n2[55];
 
void  GF(  )
{
      memset (n1,0, sizeof (n1));
      memset (n2,0, sizeof (n2));
      n1[0]=1;  //在上一篇报告里面讲过其作用,可以说是一个入口
      for ( int  i=1;i<=26;++i)
      {
           for ( int  j=0;j<=50;++j) 
           // j从0开始还是为了保留未参与合并的原值
           for ( int  k=0;k<=le[i]&&k*i+j<=50;k++)
           // k从0开始是为了保留n1[x]中原有的值,不至于在
           // 后面n1[x]=n2[x]语句中出现n1[x]数据丢失。
                n2[j+k*i]+=n1[j];  // 这和前面的判断是否存在(只需赋值 为1)组合不同
           for ( int  j=0;j<=50;++j)
           {
                n1[j]=n2[j];  // k从0开始保证了n1[x]只增不减
                n2[j]=0;
           }
      }
}
 
int  main()
{
     int  T;
     scanf ( "%d" ,&T);
     while (T--)
     {
          int  cnt=0;
          for ( int  i=1;i<=26;++i)
              scanf ( "%d" ,&le[i]);
          GF();
          for ( int  i=1;i<=50;++i)  // 题目是要统计小于50的所有可能
              cnt+=n1[i];
          printf ( "%d\n" ,cnt);
     }
     return  0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值