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;
}
原文地址:https://www.cnblogs.com/sola1994/p/4691077.html