poj 1787 记录路径的多重背包

2024-04-28 17:32

本文主要是介绍poj 1787 记录路径的多重背包,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

 

 

如题:http://poj.org/problem?id=1787

 

Description

Charlie is a driver of Advanced Cargo Movement, Ltd. Charlie drives a lot and so he often buys coffee at coffee vending machines at motorests. Charlie hates change. That is basically the setup of your next task.

Your program will be given numbers and types of coins Charlie has and the coffee price. The coffee vending machines accept coins of values 1, 5, 10, and 25 cents. The program should output which coins Charlie has to use paying the coffee so that he uses as many coins as possible. Because Charlie really does not want any change back he wants to pay the price exactly.

Input

Each line of the input contains five integer numbers separated by a single space describing one situation to solve. The first integer on the line P, 1 <= P <= 10 000, is the coffee price in cents. Next four integers, C1, C2, C3, C4, 0 <= Ci <= 10 000, are the numbers of cents, nickels (5 cents), dimes (10 cents), and quarters (25 cents) in Charlie's valet. The last line of the input contains five zeros and no output should be generated for it.

Output

For each situation, your program should output one line containing the string "Throw in T1 cents, T2 nickels, T3 dimes, and T4 quarters.", where T1, T2, T3, T4 are the numbers of coins of appropriate values Charlie should use to pay the coffee while using as many coins as possible. In the case Charlie does not possess enough change to pay the price of the coffee exactly, your program should output "Charlie cannot buy coffee.".

Sample Input

12 5 3 1 2
16 0 0 0 1
0 0 0 0 0

Sample Output

Throw in 2 cents, 2 nickels, 0 dimes, and 0 quarters.
Charlie cannot buy coffee.

 

 

题目给出总钱数,要求用1,5,10,25价值的硬币拼出总钱数,并要求硬币尽量用的多。

 

一开始没注意到硬币的要求,将硬币价值作为价值w进行背包,wa了好久

关于记录路径,只要在背包的同时,记录这一层是由那一层过来的就行,并同时记录上一层要多少个硬币才能变为这一层,至于哪一种,就可以用int t=(n-path[n])/count[n];推出。

还有要注意的是背包策略,f[j]并不是在一定金额中尽量多放硬币,f[j]代表的是满足拼成j金额能放硬币的最多数量f[j]=max(f[j-k*c]+k) ,初始化f数组为-inf。

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

int num[5];
int n;
int w[5]={0,1,5,10,25};
int f[10005];
int path[10005];
int count[10005];


void ZeroOnePack(int k,int c)
{
 int j;
 for(j=n;j>=k*c;j--)
 {
  if(f[j-k*c]+k>f[j])
  {
   f[j]=f[j-k*c]+k;
   path[j]=j-k*c;
   count[j]=k;
  }
 }
}
void CompletePack(int c)
{
 int j;
 for(j=c;j<=n;j++)
 {
  int tv=f[j];
  if(f[j-c]+1>f[j])
  {
   f[j]=f[j-c]+1;
   path[j]=j-c;
   count[j]=1;
  }
  
  
 }
}

void MultiplePack(int c,int cnt)
{
 if(c*cnt>=n)
 {
  CompletePack(c);
  return;
 }
 int k=1;
 while(k<cnt)
 {
  ZeroOnePack(k,c);
  cnt-=k;
  k*=2;
 }
  ZeroOnePack(cnt,c);
}

int main()
{
 //freopen("C:\\1.txt","r",stdin);
 //freopen("C:\\3.txt","w",stdout);
 while(~scanf("%d%d%d%d%d",&n,&num[1],&num[2],&num[3],&num[4])
  &&(n||num[1]||num[2]||num[3]||num[4]))
 {
 // printf("%d %d %d %d %d\n",n,num[1],num[2],num[3],num[4]);
  memset(f,0,sizeof(f));
  memset(path,0,sizeof(path));
  memset(count,0,sizeof(count));
  int i;
  for(i=1;i<=n;i++)
   f[i]=-10005;
  for(i=1;i<=4;i++)
   MultiplePack(w[i],num[i]);
  if(f[n]<=0)
   printf("Charlie cannot buy coffee.\n");
  else
  {
   int c1=0,c2=0,c3=0,c4=0;
   while(n)
   {
    int t=(n-path[n])/count[n];
    if(t==1)
     c1+=count[n];
    else if(t==5)
     c2+=count[n];
    else if(t==10)
     c3+=count[n];
    else
     c4+=count[n];
    n=path[n];
   }
   printf("Throw in %d cents, %d nickels, %d dimes, and %d quarters.\n",c1,c2,c3,c4);
  }
 }
 return 0;
}

 

这篇关于poj 1787 记录路径的多重背包的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/943832

相关文章

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明

Pandas中多重索引技巧的实现

《Pandas中多重索引技巧的实现》Pandas中的多重索引功能强大,适用于处理多维数据,本文就来介绍一下多重索引技巧,具有一定的参考价值,感兴趣的可以了解一下... 目录1.多重索引概述2.多重索引的基本操作2.1 选择和切片多重索引2.2 交换层级与重设索引3.多重索引的高级操作3.1 多重索引的分组聚

将sqlserver数据迁移到mysql的详细步骤记录

《将sqlserver数据迁移到mysql的详细步骤记录》:本文主要介绍将SQLServer数据迁移到MySQL的步骤,包括导出数据、转换数据格式和导入数据,通过示例和工具说明,帮助大家顺利完成... 目录前言一、导出SQL Server 数据二、转换数据格式为mysql兼容格式三、导入数据到MySQL数据

关于rpc长连接与短连接的思考记录

《关于rpc长连接与短连接的思考记录》文章总结了RPC项目中长连接和短连接的处理方式,包括RPC和HTTP的长连接与短连接的区别、TCP的保活机制、客户端与服务器的连接模式及其利弊分析,文章强调了在实... 目录rpc项目中的长连接与短连接的思考什么是rpc项目中的长连接和短连接与tcp和http的长连接短

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

Servlet中配置和使用过滤器的步骤记录

《Servlet中配置和使用过滤器的步骤记录》:本文主要介绍在Servlet中配置和使用过滤器的方法,包括创建过滤器类、配置过滤器以及在Web应用中使用过滤器等步骤,文中通过代码介绍的非常详细,需... 目录创建过滤器类配置过滤器使用过滤器总结在Servlet中配置和使用过滤器主要包括创建过滤器类、配置过滤

python获取当前文件和目录路径的方法详解

《python获取当前文件和目录路径的方法详解》:本文主要介绍Python中获取当前文件路径和目录的方法,包括使用__file__关键字、os.path.abspath、os.path.realp... 目录1、获取当前文件路径2、获取当前文件所在目录3、os.path.abspath和os.path.re

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

python与QT联合的详细步骤记录

《python与QT联合的详细步骤记录》:本文主要介绍python与QT联合的详细步骤,文章还展示了如何在Python中调用QT的.ui文件来实现GUI界面,并介绍了多窗口的应用,文中通过代码介绍... 目录一、文章简介二、安装pyqt5三、GUI页面设计四、python的使用python文件创建pytho