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 ;
int dp[maxn] ;
int dp_1[maxn] ;
int c[maxn],v[maxn] ;
int n , t ;int cas = 0 ;
int main()
{
    //freopen("in.txt" ,"r" , stdin) ;
    while(scanf("%d%d",&n , &t) &&(n+t))
    {
        for(int i = 1;i <= n;i++)
        scanf("%d" , &v[i]) ;
        for(int i = 1;i <= n;i++)
        scanf("%d" , &c[i]) ;

        for(int i = 1;i < maxn;i++)
        dp[i] = dp_1[i] = inf ;
        dp_1[0] = 0 ; dp[0] = 0 ;

        for(int i = 1;i <= n;i++)
          for(int j = v[i] ; j < maxn ;j++)
          dp_1[j] = min(dp_1[j], dp_1[j-v[i]] + 1) ;

        for(int i = 1;i <= n;i++)
        {
            for(int k = 1;k <= c[i];k*=2)
            {
                for(int j = maxn - 1;j >= k*v[i];j--)
                dp[j] = min(dp[j] , dp[j-k*v[i]] + k) ;
                c[i]-=k;
            }
            for(int j = maxn-1;j >= c[i]*v[i];j--)
            dp[j] = min(dp[j] , dp[j - c[i]*v[i]] + c[i]) ;
        }

        int ans = inf;
        for(int i = t; i <= maxn -10;i++)
        if(dp[i] != inf && dp_1[i - t] != inf)
        ans = min(dp[i] + dp[i-t] , ans) ;

        printf("Case %d: " ,++cas) ;
        if(ans == inf)puts("-1") ;
        else cout<<ans<<endl;
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-18 19:29:40

hdu3591The 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, 那肯定找钱)找钱给他. 售货员每次总是用

【背包专题】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 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(多重背包)

#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

HDU_3591_(多重背包+完全背包)

The trouble of Xiaoqian Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2006    Accepted Submission(s): 712 Problem Description In the country of ALPC , Xiaoqian is a very famous mathematician.

POJ 3260 多重背包+完全背包

前几天刚回到家却发现家里没网线 && 路由器都被带走了,无奈之下只好铤而走险尝试蹭隔壁家的WiFi,不试不知道,一试吓一跳,用个手机软件简简单单就连上了,然后在浏览器输入192.168.1.1就能看到他的路由器的一切信息,包括密码,然后打开笔记本……好了,废话不多说,能连上网后第一时间当然是继续和队友之前约好的训练了. 今天翻看到之前落下的一道混合背包题目,然后在草稿本上慢慢地写递推方程,把一些细节细心地写好…(本来不用太费时间的,可是在家嘛,一会儿妈走来要我教她玩手机,一会儿有一个亲戚朋

POJ3260——The Fewest Coins(多重背包+完全背包)

The Fewest Coins DescriptionFarmer John has gone to town to buy some farm supplies. Being a very efficient man, he always pays for his goods in such a way that the smallest number of coins changes hands, i.e., the number of coins he uses to pay plus

动态规划之背包问题-01背包+完全背包+多重背包

01背包 有n种不同的物品,每种物品分别有各自的体积 v[i],价值 w[i]  现给一个容量为V的背包,问这个背包最多可装下多少价值的物品. 1 for(int i = 1; i <= n; i++) 2 for(int j = V; j >= v[i]; j--) 3 dp[j] = max(dp[j], dp[j-v[i]]+w[i]); //dp[V]为所求 完全背包 01背包每种物品只能取一个, 完全背包即物品不记件数,可取多件. 1 for(int i = 1; i <= n

hdu 3591 The trouble of Xiaoqian

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