poj 1787 Charlie's Change

简介: 思路: 多重背包 分析: 1 题目给定的数据明显就是多重背包,但是题目有个难点就是输出路径,0/1背包里面有输出路经的方法,做法做法是通过记录前面的状态 2 这一题还要求输出每种硬币的个数,那么这边利用mark数组,mark[i][0] ...
思路: 多重背包
分析:
1 题目给定的数据明显就是多重背包,但是题目有个难点就是输出路径,0/1背包里面有输出路经的方法,做法做法是通过记录前面的状态
2 这一题还要求输出每种硬币的个数,那么这边利用mark数组,mark[i][0] = pos 表示的是当前这个状态是取的是第pos个物品,mark[i][pos] = x;表示的是当前这个状态增加了x个物品

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int MAXN = 10010;
const int N = 5;
const int INF = 0x3f3f3f3f;

int v[N] = {0,1,5,10,25};
int sum , num[N] , dp[MAXN];
int ans[N] , path[MAXN] , mark[MAXN][N];

void zeroOnePack(int pos , int k , int cost , int weight){
    for(int i = sum ; i >= cost ; i--){
        dp[i] = max(dp[i] , dp[i-cost]+k);
        if(dp[i] == dp[i-cost]+1){
            path[i] = i-cost;
            mark[i][0] = pos;
            mark[i][pos] = k;
        }
    }
}

void completePack(int pos , int cost , int weight){
    for(int i = cost ; i <= sum ; i++){
        dp[i] = max(dp[i] , dp[i-cost]+1);
        if(dp[i] == dp[i-cost]+1){
            path[i] = i-cost;
            mark[i][0] = pos;
            mark[i][pos] = 1;
        }
    }
}

void multiplePack(int pos , int cost,int weight,int amount){
    if(cost*amount >= sum){
        completePack(pos , cost , weight);
        return;
    }
    int k = 1;
    while(k < amount){
        zeroOnePack(pos , k , k*cost , k*weight); 
        amount -= k;
        k *= 2; 
    }
    zeroOnePack(pos , amount , amount*cost , amount*weight);
}

int main(){
    while(scanf("%d",&sum)){
        scanf("%d%d%d%d",&num[1],&num[2],&num[3],&num[4]);
        if(!(sum+num[1]+num[2]+num[3]+num[4]))
            break;
        for(int i = 0 ; i < MAXN ; i++)
            dp[i] = -INF;
        dp[0] = 0;
        for(int i = 1 ; i <= 4 ; i++)
            multiplePack(i , v[i],v[i],num[i]);
        if(dp[sum] < 0)
            puts("Charlie cannot buy coffee.");
        else{
            int pos = sum;
            memset(ans , 0 , sizeof(ans));
            while(pos){
                int tmp = mark[pos][0];
                ans[tmp] += mark[pos][tmp]; 
                pos = path[pos];
            }
            printf("Throw in %d cents, %d nickels, %d dimes, and %d quarters.\n",ans[1],ans[2],ans[3],ans[4]);
        }
    }
    return 0;
}



目录
相关文章
阿里云全球19个地域节点,哪个节点的服务器好,速度快?
阿里云服务器有多少个地域节点?究竟哪个节点的云服务器好,速度快?
35139 0
|
XML JSON 缓存
Java实现根据关键词搜索抖音视频数据方法
Java实现根据关键词搜索抖音视频数据方法
1108 1
|
弹性计算 Ubuntu 安全
阿里云服务器公共镜像、自定义镜像、共享镜像、云市场镜区别及选择参考
在我们购买阿里云服务器时,云服务器的操作系统指的是镜像,它为云服务器实例提供操作系统、初始化应用数据、预装的软件,通过镜像可以创建并部署云服务器实例,在选择时有公共镜像、自定义镜像、共享镜像、云市场镜、社区镜像这5中镜像可选,有的新手用户朋友并不知道它们有什么区别,可能不知道应该如何选择,本文就来介绍一下它们之间的区别及选择建议。
阿里云服务器公共镜像、自定义镜像、共享镜像、云市场镜区别及选择参考
|
负载均衡 Java 应用服务中间件
阿里云负载均衡(ALB)
阿里云负载均衡(ALB)
1818 1
|
SQL 存储 安全
web安全攻击方法流量分析
web安全攻击方法流量分析
886 1
web安全攻击方法流量分析
|
弹性计算 固态存储 数据可视化
阿里云GPU服务器优惠价格表(2023更新)
2023阿里云GPU服务器优惠价格表,阿里云GPU服务器gn6v、gn6i、vgn6i-vws和gn6e可以享受新用户价格,包年低至3折起
1612 0
|
SQL 分布式计算 Oracle
5.DataWorks 批量生成同步任务|学习笔记
快速学习5.DataWorks 批量生成同步任务
5.DataWorks 批量生成同步任务|学习笔记
|
SQL XML Java
第15篇:Mybatis中打印Sql信息
在Mybatis中如果我们要对我们的sql信息进行检查, 只能启动Spring容器, 去执行根据成功和失败来判断我们的逻辑是否有问题。 此时会比较耗时,因为要启动容器。基于这个痛点, 本文要设计一个工具。使我们不依赖Spring容器,也不依赖任何外部插件,直接就把 Sql信息的打印出来。
490 0
|
弹性计算 JSON 关系型数据库
一键批量创建服务器并绑定弹性IP,助力公网业务快速开服
本文将为大家介绍一种批量创建ECS、创建EIP、并完成EIP绑定ECS的方法。此方法利用资源编排ROS模板,通过一次性的ECS、ECS参数设置,可以快速批量部署带公网的服务器上线。
1702 0
一键批量创建服务器并绑定弹性IP,助力公网业务快速开服
|
网络协议 网络安全 数据安全/隐私保护
实现公网访问树莓派4B(花生壳内网穿透)
实现公网访问树莓派4B(花生壳内网穿透)
732 0
实现公网访问树莓派4B(花生壳内网穿透)