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.....\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;
}
时间: 2024-10-12 16:16:56

hdu 3591 The trouble of Xiaoqian(多重背包)的相关文章

HDU 3591 The trouble of Xiaoqian(多重背包+01背包)

HDU 3591 The trouble of Xiaoqian(多重背包+01背包) http://acm.hdu.edu.cn/showproblem.php?pid=3591 题意: 有一个具有n种货币的货币系统, 每种货币的面值为val[i]. 现在小杰手上拿着num[1],num[2],-num[n]个第1种,第2种-第n种货币去买价值为T(T<=20000)的商品, 他给售货员总价值>=T的货币,然后售货员(可能,如果小杰给的钱>T, 那肯定找钱)找钱给他. 售货员每次总是用

HDU 3591 The trouble of Xiaoqian(多重背包+全然背包)

http://acm.hdu.edu.cn/showproblem.php? pid=3591 题意: 有一个具有n种货币的货币系统, 每种货币的面值为val[i]. 如今小杰手上拿着num[1],num[2],-num[n]个第1种,第2种-第n种货币去买价值为T(T<=20000)的商品, 他给售货员总价值>=T的货币,然后售货员(可能,假设小杰给的钱>T,那肯定找钱)找钱给他. 售货员每次总是用最少的硬币去找钱给小杰. 如今的问题是: 小杰买价值T的商品时, 他给售货员的硬币数目+

hdu 3591 The trouble of Xiaoqian

hdu 3591  The trouble of Xiaoqian 题意:xiaoqi要买一个T元的东西,当前的货币有N种,xiaoqi对于每种货币有Ci个:题中定义了最小数量即xiaoqi拿去买东西的钱的张数加上店家找的零钱的张数(店家每种货币有无限多张,且找零是按照最小的数量找零的):问xiaoqi买元东西的最小数量? 多重背包+完全背包: 思路:这个最小数量是拿去买东西的张数和找零的张数之和,其实我们只需要将这两个步骤分开,开算出能买T元东西的前i最少f[i]张,这里涉及到容量问题:容量只

hdu3591The trouble of Xiaoqian 多重背包+完全背包

//给出Xiaoqian的钱币的价值和其身上有的每种钱的个数 //商家的每种钱的个数是无穷,xiaoqian一次最多付20000 //问怎样付钱交易中钱币的个数最少 //Xiaoqian是多重背包 //商家是完全背包 #include<cstdio> #include<cstring> #include<iostream> using namespace std ; const int maxn = 20010 ; const int inf = 0x3f3f3f3f

hdu 2082 找单词(母函数|多重背包)

http://acm.hdu.edu.cn/showproblem.php?pid=2082 每一个字母的价值固定,但数目不定.所以每个字母对应的表达式也不同,若第i个字母的个数为a[i],价值为i,那么它的母函数为(1+x^i+x^(2i)+.....+x^(a[i]*b[i])).那么将i属于[1,26]的母函数相乘得到的x^m(1<=m<=50)的系数相加就是答案. #include <stdio.h> #include <iostream> #include &

HDU 2159 FATE【二维多重背包】

大意:二维多重背包 分析:二维多重背包 代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <vector> 5 using namespace std; 6 7 const int maxn = 105; 8 int dp[maxn][maxn]; 9 int a[maxn], b[maxn]; 10 11 int main() { 12 int n,

HDU 3591 (完全背包+二进制优化的多重背包)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3591 The trouble of Xiaoqian Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2798    Accepted Submission(s): 972 Problem Description In the countr

【背包专题】C - The trouble of Xiaoqian hdu3591【混合背包:多重背包+完全背包】

In the country of ALPC , Xiaoqian is a very famous mathematician. She is immersed in calculate, and she want to use the minimum number of coins in every shopping. (The numbers of the shopping include the coins she gave the store and the store backed

HDU 3591 多重背包

给出N种钱币和M 给出N种钱币的面值和个数 NPC拿着这N些钱币去买价值M的物品,可以多付,然后被找零,找零的钱也为这些面值,但没有数量限制 问最少经手的钱币数量 对于NPC做一个付款多重背包 然后对于找零做一个完全背包 ans=Min(dp1[i]+dp2[i-m],ans); #include "stdio.h" #include "string.h" int n,m; int dp1[20010],dp2[20010],c[20010],v[20010]; v