Live2d Test Env

母函数做的题

这些题都可以用动规或者背包做

HDU1028

HDU1398

HDU2079

HDU2082

 

HDU1028
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<memory.h>
using namespace std;
int c1[330],c2[330],ans[330];
int n,i,j,m,k;
void _get()
{
    for(i=0;i<=120;i++) {
        c1[i]=1;c2[i]=0;
    }
    ans[1]=1;
    for(i=2;i<=120;i++){
      for(j=0;j<=120;j++)
        for(k=0;k+j<=120;k+=i) c2[k+j]+=c1[j]; 
        for(k=0;k<=120;k++) { c1[k]=c2[k];c2[k]=0;}
        ans[i]=c1[i];
    }
}
int main()
{
    _get();
    while(cin>>n)  cout<<ans[n]<<endl;
    return 0;
}
 
HDU1398

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<memory.h>
#include<algorithm>
#include<cmath>
using namespace std;
long long  c1[310],c2[310],ans;
void _get(int v)
{
    int i,j,k;    
    for(i=0;i<=v;i++) { c1[i]=0;c2[i]=0;}
    c1[0]=1;
    for(i=1;i<=17;i++){
        int tmp=i*i;
        for(j=0;j<=v;j++)
        for(k=0;j+k*tmp<=v;k++)  c2[j+k*tmp]+=c1[j];         
        for(k=0;k<=v;k++)  { c1[k]=c2[k]; c2[k]=0; }        
    }
    ans=c1[v];
}
int main()
{
    int n;
    while(~scanf("%d",&n)){
        if(n==0) return 0;
        _get(n);
        printf("%lld\n",ans);
    }
    return 0;
}


 
HDU2079
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<map>
#include<memory.h>
#include<algorithm>
using namespace std;
int c1[1160],c2[1160];
int x[300];
int main()
{
    int T,n,i,j,k,K,ans;
    cin>>T;
    while(T--)
    {
        ans=0;
        cin>>n>>K;
        memset(c1,0,sizeof(c1));
        memset(c2,0,sizeof(c2));
        memset(x,0,sizeof(x));
        for(i=1;i<=K;i++){
            scanf("%d%d",&j,&k);
            x[j]+=k;
        }
        for(i=0;i<=x[1];i++) c1[i]=1;
        for(i=2;i<=8;i++)
        {
            for(j=0;j<=n;j++)
              for(k=0;(k<=x[i])&&((j+k*i)<=n);k++)
               c2[j+k*i]+=c1[j];
            for(k=0;k<=n;k++){
               c1[k]=c2[k];
               c2[k]=0;
            }

        } 
        printf("%d\n",c1[n]);
    }
    return 0;
}


HDU2082
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<map>
#include<memory.h>
#include<algorithm>
using namespace std;
int c1[1160],c2[1160];
int x[300];
int main()
{
    int T,n,i,j,k,ans;
    cin>>T;
    while(T--)
    {
        ans=0;
        memset(c1,0,sizeof(c1));
        memset(c2,0,sizeof(c2));
        for(i=1;i<=26;i++)    scanf("%d",&x[i]);
        for(i=0;i<=min(50,x[1]);i++) c1[i]=1;
        for(i=2;i<=26;i++)
        {
            for(j=0;j<=50;j++)
              for(k=0;(k<=x[i])&&((j+k*i)<=50);k++)
               c2[j+k*i]+=c1[j];
            for(k=0;k<=50;k++){
               c1[k]=c2[k];
               c2[k]=0;
            }

        } 
        for(i=1;i<=50;i++) ans+=c1[i];
        printf("%d\n",ans);
    }
    return 0;
}

 

posted @ 2017-09-27 21:06  nimphy  阅读(212)  评论(0编辑  收藏  举报