最少硬币问题(受限)NK1132

简介: 1132: 最少硬币问题 Time Limit: 1500 ms    Memory Limit: 10000 kB   Total Submit : 909 (187 users)   Accepted Submit : 241 (132 users)   Page View : 9030  Font Style: Aa Aa Aa 设有n 种不同面值的硬币,各硬币的面值存于数组T[1:n]中。

1132: 最少硬币问题


Time Limit: 1500 ms    Memory Limit: 10000 kB  
Total Submit : 909  (187 users)    Accepted Submit : 241  (132 users)    Page View : 9030 
Font Style: Aa Aa Aa

设有n 种不同面值的硬币,各硬币的面值存于数组T[1:n]中。现要用这些面值的硬币来找钱。可以使用的各种面值的硬币个数存于数组Coins[1:n]中。
对任意钱数0≤m≤20001,设计一个用最少硬币找钱m的方法。

编程任务:
对于给定的1≤n≤10,硬币面值数组T和可以使用的各种面值的硬币个数数组Coins,以及钱数m,0≤m≤20001,编程计算找钱m的最少硬币数。

Input

输入包括多组测试数据,每组输入的第一行中只有1 个整数给出n的值,第2 行起每
行2 个数,分别是T[j]和Coins[j]。每组输入最后1 行是要找的钱数m。

Output

对于每组输入数据,输出一行,即计算出最少硬币数。问题无解时输出-1。

Sample Input

3
1 3
2 3
5 3
18

Sample Output

5

Source

View Code
 1 /*类似无穷硬币 ,wa 
 2 */
 3 #include <iostream>
 4 #include <cstring>
 5 using namespace std;
 6 
 7 const int maxn = 15;
 8 int coins[maxn],num[maxn];
 9 int n,money;
10 int ans[20010];
11 
12 int main()
13 {
14     int i,j,k;
15     int a, b;
16     while(cin>>n)
17     {
18         int max = -1;
19         memset(ans,-1,sizeof(ans));
20         for(i=0; i<n; i++)
21         {
22             cin>>a>>b;
23             coins[i] = a;
24             if(a>max)
25                 max = a;
26             num[i] = b;
27         }
28         cin>>money;
29         //最好先排序
30         for(k=1; k<=money; k++)
31         {
32             int min = 0x7fffffff; 
33             for(i=0; i<n; i++)
34                 for(j=1; j<=num[i]; j++)
35                 {
36                     if(k>=coins[i])//不是coins[j] 
37                     {
38                         int temp = ans[k-coins[i]] + 1;
39                         if(min>temp)
40                             min = temp;
41                     }
42                 }
43             ans[k] = min;
44         }
45         if(ans[money]>=(money/max))
46             cout<<ans[money]<<endl;
47         else
48             cout<<"-1"<<endl;
49              
50     }
51     
52     return 0;
53 }
View Code
#include <iostream>
#include <cstring>
using namespace std;

const int maxn = 15;
int coins[maxn],num[maxn];
int n,money;
int ans[maxn][20010];

int main()
{
    int i,j,k;
    int a, b;
    while(cin>>n)
    {
        memset(ans,0,sizeof(ans));
        for(i=0; i<n; i++)
        {
            cin>>a>>b;
            coins[i] = a;
            num[i] = b;
        }
        cin>>money;
        
        for(i=0; i<=money; i++)
        {
            if(i%coins[0]==0)
                ans[0][i] = i/coins[i];
            else
                ans[0][i] = INT_MAX;
        }
        for(i=1; i<n; i++)
            for(j=0; j<=money; j++)
            if(j<coins[i])
                ans[i][j] = ans[i-i][j];
            else        
                ans[i][j] = min(ans[i-i][j],ans[i-1][j-coins[i]] + 1);
        cout<<ans[n-1][money]<<endl;
        
    }
    return 0;
}
View Code
/*类似无穷硬币 ,wa 
*/
#include <iostream>
#include <cstring>
using namespace std;

const int maxn = 15;
int coins[maxn],num[maxn];
int n,money;
int ans[20010];

int main()
{
    int i,j,k;
    int a, b;
    while(cin>>n)
    {
        int max = -1;
        memset(ans,0,sizeof(ans));
        for(i=0; i<n; i++)
        {
            cin>>a>>b;
            coins[i] = a;
            if(a>max)
                max = a;
            num[i] = b;
        }
        cin>>money;
        //最好先排序
        for(k=1; k<=money; k++)
        {
            int min = 0x7fffffff; 
            for(i=0; i<n; i++)
            //dp[j]=MIN(dp[j],dp[j-k*coins]+k),
                for(j=1; j<=num[i]; j++)//此时ans初始化为-1答案少一 
                {
                    if(k>=j*coins[i])//不是coins[j] 
                    {
                        int temp = ans[k-j*coins[i]] + j;
                        if(min>temp)
                            min = temp;
                    }
                }
            ans[k] = min;
        }
        if(ans[money]>=(money/max))
            cout<<ans[money]<<endl;
        else
            cout<<"-1"<<endl;
             
    }
    
    return 0;
}


 

目录
相关文章
|
算法 安全 关系型数据库
阿里云SDDP(敏感数据保护)测试调研
海量数据的使用正在为企业创造越来越多的价值,与此同时,数据也正成为企业的核心资产;如何在对数据高效使用的同时,确保数据的安全,尤其是敏感数据的安全,是一个重要的安全课题,也是很多企业的核心诉求。本次对阿里云SDDP(敏感数据保护)产品进行了测试调研。
4738 0
|
11月前
|
XML Java 数据安全/隐私保护
Spring Aop该如何使用
本文介绍了AOP(面向切面编程)的基本概念和术语,并通过具体业务场景演示了如何在Spring框架中使用Spring AOP。文章详细解释了切面、连接点、通知、切点等关键术语,并提供了完整的示例代码,帮助读者轻松理解和应用Spring AOP。
281 2
Spring Aop该如何使用
|
11月前
|
存储 Python
Python编程入门:理解基础语法与编写简单程序
本文旨在为初学者提供一个关于如何开始使用Python编程语言的指南。我们将从安装Python环境开始,逐步介绍变量、数据类型、控制结构、函数和模块等基本概念。通过实例演示和练习,读者将学会如何编写简单的Python程序,并了解如何解决常见的编程问题。文章最后将提供一些资源,以供进一步学习和实践。
207 1
|
12月前
|
安全 物联网 5G
5G技术在软件开发中的应用
5G技术作为新一代移动通信标准,凭借高速度、大带宽和低延迟的特点,正深刻改变软件开发领域。本文介绍了5G技术的基本概念及其在实时应用优化、物联网集成、增强现实/虚拟现实和云计算等方面的应用,并讨论了安全性、技术兼容性和成本等挑战。5G为开发者带来了新机遇,但也需应对各种挑战,以充分利用其潜力。
|
开发框架 前端开发 JavaScript
智慧医院检验信息系统源码,自动接收检验数据,打印检验报告,保存检验信息
质控管理 支持Westguard,Gubbuss+T(n)等多种质控规则,自动判断是否失控,可自动计算靶值、SD,多个质控品可列于一个图表上。 数据共享 与HIS系统、体检系统无缝连接,接受临床科室的检验申请,支持检验科录入检验申请单,真正实现信息全网共享;
222 1
智慧医院检验信息系统源码,自动接收检验数据,打印检验报告,保存检验信息
|
存储 人工智能 安全
鲲鹏系列五: DevKit开发全系列工具技术要点总结
摩尔定律发展趋势的逐渐放缓,让算力和性能陷入一系列发展瓶颈,市场对创新架构的需求日益加深,计算平台的创新之战一触即发
990 0
鲲鹏系列五: DevKit开发全系列工具技术要点总结
|
JavaScript 前端开发 数据安全/隐私保护
用vitepress十分钟肝了一个博客,并把过去一年半每天的日常记录汇总了过来
其实一直有这样一个想法,想把自己的流水账记录,稍微整理一下,放在一个自己打造的个人博客下面,让知识不在孤零零的呆在哪里,有时候可能更方便自己,甚至可以启发很多同行......
907 0
|
安全 Linux 网络安全
SIP不能注册或呼叫到服务器端怎样处理
SIP不能注册或呼叫到服务器端怎样处理
什么叫灰度测试
灰度测试是什么意思呢?如果对互联网软件研发行业不太了解的话,可能对这个词还是很陌生的,其实灰度测试就是指如果软件要在不久的将来推出一个全新的功能,或者做一次比较重大的改版的话,要先进行一个小范围的尝试工作,然后再慢慢放量,直到这个全新的功能覆盖到所有的系统用户,也就是说在新功能上线的黑白之间有一个灰,所以这种方法也通常被称为灰度测试。
10158 1
|
存储 缓存 NoSQL
微服务架构四大金刚利器
概述 互联网应用发展到今天,从单体应用架构到SOA以及今天的微服务,随着微服务化的不断升级进化,服务和服务之间的稳定性变得越来越重要,分布式系统之所以复杂,主要原因是分布式系统需要考虑到网络的延时和不可靠,微服务很重要的一个特质就是需要保证服务幂等,保证幂等性很重要的前提需要分布式锁控制并发,同时缓存、降级和限流是保护微服务系统运行稳定性的三大利器。
11086 0