码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 3591 The trouble of Xiaoqian(多重背包)

时间:2015-07-31 06:37:00      阅读:110      评论:0      收藏:0      [点我收藏+]

标签:

 

 

#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.....\n",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\n",i,i-anst,dp[i],dp[i-anst],ans);
              }
           }
        }
        if(ok==1) printf("Case %d: %d\n",cas++,ans);
        else printf("Case %d: -1\n",cas++);
    }
    return 0;
}

 

hdu 3591 The trouble of Xiaoqian(多重背包)

标签:

原文地址:http://www.cnblogs.com/sola1994/p/4691077.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!