zoukankan      html  css  js  c++  java
  • HDU 1085(dp 母函数)

    题意: 拉登有面值 1 2 5  的钱币 分别 n1 n2 n5 个

              求出最大能连续组合到多大         

    思路: 想来想去都有bug 最后简单粗暴的一个一个来处理了

    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    #include<stack>
    #define mem(a,b) memset(a,b,sizeof(a))
    #define ll __int64
    #define MAXN 1000
    #define INF 0x7ffffff
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    int num[10000];
    using namespace std;
    int main()
    {
        int n1,n2,n5;
        int i,j,flag,ans;
        while(scanf("%d%d%d",&n1,&n2,&n5)!=EOF)
        {
            if(n1==0&&n2==0&&n5==0) break;
            mem(num,-1);
            num[0]=0;
            flag=0;
            ans=0;
            int m=n1+n2*2+n5*5;  //最大8000
            int cnt=n1+n2+n5;   //最大3000
            while(cnt--)
            {
                if(n1)     {flag=1;n1--;}
                else if(n2){flag=2;n2--;}
                else if(n5){flag=5;n5--;}
    
                for(i=m;i>=0;i--)
                {
                    if(num[i]==0)
                    {
                      num[i+flag]=0;
                    }
                }
            }
            for(i=0;i<=100000;i++)
            {
                //cout<<i<<"  "<<num[i]<<endl;
                if(num[i]==-1)
                {
                    ans=i;break;
                }
            }
            cout<<ans<<endl;
        }
        return 0;
    }
    

      

    母函数

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    int num[10];
    int c1[9000];
    int c2[9000];
    void fun()
    {
        int n=num[0]+num[1]*2+num[2]*5;
        int i,j,k;
        memset(c2,0,sizeof(c2));
        memset(c1,0,sizeof(c1));
        for(i=0;i<=num[0];i++)
        {
            c1[i]=1;
        }
    
        for(j=0;j<=num[0];j++)
        {
            for(k=0;k<=num[1]*2;k+=2)
            {
                c2[j+k]+=c1[j];
            }
        }
        for(j=0;j<=n;j++)
        {
            c1[j]=c2[j];
            c2[j]=0;
        }
    
        /*for(i=0;i<=18;i++)
        {
            printf("%d %d
    ",i,c1[i]);
        }*/
    
        for(j=0;j<=num[1]*2+num[0];j++)
        {
            for(k=0;k<=num[2]*5;k+=5)
            {
                c2[j+k]+=c1[j];
            }
        }
        for(j=0;j<=n;j++)
        {
            c1[j]=c2[j];
            c2[j]=0;
        }
    }
    int main()
    {
      int n;
      int i,j,k;
      while(scanf("%d%d%d",&num[0],&num[1],&num[2])!=EOF)
      {
          if(num[0]==0&&num[1]==0&&num[2]==0) break;
          fun();
          for(i=0;i<=8010;i++)
          {
              if(c1[i]==0)
              {
                  printf("%d
    ",i);
                  break;
              }
              //printf("%d %d
    ",i,c1[i]);
          }
      }
      return 0;
    }
    
  • 相关阅读:
    红黑树——以无厚入有间
    红黑树——依天理以神遇
    B-树 分合之道
    B-树 动机与结构
    云心出岫——Splay Tree
    双散列和再散列暨散列表总结
    开放定址法——平方探测(Quadratic Probing)
    [LeetCode 109]
    [LeetCode 110]
    [LeetCode 111]
  • 原文地址:https://www.cnblogs.com/sola1994/p/3915909.html
Copyright © 2011-2022 走看看