支付对应的是多重背包问题,找零对应完全背包问题。

难点在于找上限T+maxv*maxv,可以用鸽笼原理证明,实在想不到就开一个尽量大的数组。

 1 #include  <map>
2 #include <set>
3 #include <cmath>
4 #include <queue>
5 #include <cstdio>
6 #include <vector>
7 #include <climits>
8 #include <cstring>
9 #include <cstdlib>
10 #include <iostream>
11 #include <algorithm>
12 using namespace std;
13 const int maxm=10000+120*120+5;
14 int dp_pay[maxm],dp_change[maxm];
15 int N,T,v[105],c[105];
16
17 void multi_knapsack(int n,int W){//多重背包,二进制拆分
18 memset(dp_pay,0x3f,sizeof(dp_pay));
19 dp_pay[0]=0;
20 for(int i=1;i<=N;i++){//转化为完全背包
21 if(c[i]*v[i]>=W){
22 for(int j=v[i];j<=W;j++)
23 dp_pay[j]=min(dp_pay[j],dp_pay[j-v[i]]+1);
24 }
25 else{
26 for(int k=1;c[i]>0;k<<=1){//二进制拆分
27 int x=min(k,c[i]);
28 for(int j=W;j>=v[i]*x;j--)
29 dp_pay[j]=min(dp_pay[j],dp_pay[j-v[i]*x]+x);
30 c[i]-=x;
31 }
32 }
33 }
34 }
35
36 void complete_knapsack(int n,int W){
37 memset(dp_change,0x3f,sizeof(dp_change));
38 dp_change[0]=0;
39 for(int i=1;i<=N;i++){
40 for(int j=v[i];j<=W;j++)
41 dp_change[j]=min(dp_change[j],dp_change[j-v[i]]+1);
42 }
43 }
44
45 int main(){
46 while(~scanf("%d%d",&N,&T)){
47 int maxv=0,W;
48 for(int i=1;i<=N;i++)
49 scanf("%d",&v[i]),maxv=max(maxv,v[i]);
50 for(int i=1;i<=N;i++)
51 scanf("%d",&c[i]);
52 maxv=maxv*maxv;
53 multi_knapsack(N,maxv+T);
54 complete_knapsack(N,maxv);
55 int ans=0x3f3f3f3f;
56 for(int i=0;i<=maxv;i++)
57 ans=min(ans,dp_pay[i+T]+dp_change[i]);
58 if(ans==0x3f3f3f3f)
59 ans=-1;
60 printf("%d\n",ans);
61 }
62 }

POJ3260 The Fewest Coins(混合背包)的更多相关文章

  1. POJ3260:The Fewest Coins(混合背包)

    Description Farmer John has gone to town to buy some farm supplies. Being a very efficient man, he a ...

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

    The Fewest Coins DescriptionFarmer John has gone to town to buy some farm supplies. Being a very eff ...

  3. POJ 3260 The Fewest Coins(多重背包+全然背包)

    POJ 3260 The Fewest Coins(多重背包+全然背包) http://poj.org/problem?id=3260 题意: John要去买价值为m的商品. 如今的货币系统有n种货币 ...

  4. 洛谷P2851 [USACO06DEC]最少的硬币The Fewest Coins(完全背包+多重背包)

    题目描述 Farmer John has gone to town to buy some farm supplies. Being a very efficient man, he always p ...

  5. poj3260 The Fewest Coins

    Description Farmer John has gone to town to buy some farm supplies. Being a very efficient man, he a ...

  6. POJ 3260 The Fewest Coins(完全背包+多重背包=混合背包)

    题目代号:POJ 3260 题目链接:http://poj.org/problem?id=3260 The Fewest Coins Time Limit: 2000MS Memory Limit: ...

  7. POJ3260The Fewest Coins[背包]

    The Fewest Coins Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6299   Accepted: 1922 ...

  8. The Fewest Coins POJ - 3260

    The Fewest Coins POJ - 3260 完全背包+多重背包.基本思路是先通过背包分开求出"付出"指定数量钱和"找"指定数量钱时用的硬币数量最小值 ...

  9. HDU 3535 AreYouBusy (混合背包)

    题意:给你n组物品和自己有的价值s,每组有l个物品和有一种类型: 0:此组中最少选择一个 1:此组中最多选择一个 2:此组随便选 每种物品有两个值:是需要价值ci,可获得乐趣gi 问在满足条件的情况下 ...

随机推荐

  1. k8s QoS与pod驱逐

    概述 QoS是Quality of Service的缩写,即服务质量.每个pod属于某一个QoS分类,而Kubernetes会根据pod的QoS级别来决定pod的调度.抢占调度和驱逐优先级,而且pod ...

  2. 使用.NET简单实现一个Redis的高性能克隆版(三)

    译者注 该原文是Ayende Rahien大佬业余自己在使用C# 和 .NET构建一个简单.高性能兼容Redis协议的数据库的经历. 首先这个"Redis"是非常简单的实现,但是他 ...

  3. LuoguP1131 [ZJOI2007]时态同步 (树形DP,贪心)

    贪心就离根最大距离 #include <iostream> #include <cstdio> #include <cstring> #include <al ...

  4. BZOJ3894/LuoguP4313 文理分科 (最小割)

    #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> ...

  5. 用VS Code搞Qt6:至简窗口部件——QWidget

    在正题开始之前,老周照例扯点别的.嗯,咱们扯一下在 VS 2022 下结合 CMake 开发 Qt6 时的环境变量设置问题.在VS Code 中,通够通过 CMake Tools 扩展的配置来设置环境 ...

  6. 全局异常处理及参数校验-SpringBoot 2.7 实战基础 (建议收藏)

    优雅哥 SpringBoot 2.7 实战基础 - 08 - 全局异常处理及参数校验 前后端分离开发非常普遍,后端处理业务,为前端提供接口.服务中总会出现很多运行时异常和业务异常,本文主要讲解在 Sp ...

  7. 最大连续子序列(简单DP实现)

    最大连续子序列 最大连续子数列和一道很经典的算法问题,给定一个数列,其中可能有正数也可能有负数,我们的任务是找出其中连续的一个子数列(不允许空序列),使它们的和尽可能大.我们一起用多种方式,逐步优化解 ...

  8. 【java】学习路径21-基本类型的包装类

    int i =100; //Integer i2 = new Integer(100); //我们发现已被弃用,现在我们一般的方法是使用valueOf Integer i2 = null; i2 = ...

  9. 【java】学习路线1-类型转换、隐式转换、强制转换

    /**文档注释,这里是一段文章一般放在类的外面*/public class HelloWorld{    //这个是注释的文本    public static void main(String[] ...

  10. JavaScript设计模式及代码实现——单例模式

    单例模式 1 定义 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 2 应用时机 当一个类的实例被频繁使用,如果重复创建这个实例,会无端消耗资源.比如 dialog 弹窗会被全局重复使用 业务 ...