zoukankan      html  css  js  c++  java
  • hdu 3591 The trouble of Xiaoqian(多重背包)

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<vector>
    using namespace std;
    int v[200],c[200];
    int dp[30000];
    int main()
    {
        int n,t;
        int i,j,k;
        int cas=1;
        while(scanf("%d%d",&n,&t),(n+t))
        {
            memset(dp,-1,sizeof(dp));
            dp[0]=0;
            for(i=0;i<n;i++)
            {
                scanf("%d",&v[i]);
            }
            for(i=0;i<n;i++)
            {
                scanf("%d",&c[i]);
            }
    
            for(i=0;i<n;i++)
            {
                int tot=c[i];
                for(j=1;j<=tot;j*=2)
                {
                    tot-=j;
                    int add=v[i]*j;
    
                    for(k=20000;k>=add;k--)
                    {
                         if(dp[k-add]!=-1)
                         {
                             if(dp[k]==-1) dp[k]=dp[k-add]+j;
                             else
                            {
                                dp[k]=min(dp[k],dp[k-add]+j);
                            }
                         }
                    }
    
                }
                if(tot!=0)
                {
                   int add=v[i]*tot;
                    for(k=20000;k>=add;k--)
                    {
                         if(dp[k-add]!=-1)
                         {
                             if(dp[k]==-1) dp[k]=dp[k-add]+tot;                     
                             else
                             {
                                dp[k]=min(dp[k],dp[k-add]+tot);
                             }
                         }
                    }
                }
            }
            //printf("%d.....
    ",dp[5]);
            int ok=0;
            int ans=100000;
            int anst=t;
            while(dp[t]==0) t++;
            if(t<=20000)
            {
               for(i=t;i<=20000;i++)
               {
                  if(dp[i]!=-1&&dp[i-anst]!=-1)
                  {
                      ok=1;
                      ans=min(ans,dp[i]+dp[i-anst]);
                      //printf("%d %d %d %d %d
    ",i,i-anst,dp[i],dp[i-anst],ans);
                  }
               }
            }
            if(ok==1) printf("Case %d: %d
    ",cas++,ans);
            else printf("Case %d: -1
    ",cas++);
        }
        return 0;
    }
    
  • 相关阅读:
    SVN服务器搭建和使用(一)
    Python3.x和Python2.x的区别
    myeclipse启动不了的解决方法
    学习第49天
    学习第48天
    学习第47天
    学习第46天
    学习第45天
    学习第44天
    学习第43天
  • 原文地址:https://www.cnblogs.com/sola1994/p/4691077.html
Copyright © 2011-2022 走看看