最少硬币问题(受限)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]中。现要用这些面值的硬币来找钱。可以使用的各种面值的硬币个数存于数组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;
}

 

时间: 2024-09-28 22:31:10

最少硬币问题(受限)NK1132的相关文章

最少硬币问题(无穷硬币)

1 /*贪心可能导致无解; 2 硬币系统是10,7,5,1元,那么12元用贪心法得到的硬币数为3,而最少硬币数是2. 3 对于此题,可以举个例子: 4 若有1,5,7,10这四种货币,则易知 5 1=1 6 2=1+1 7 3=1+1+1 8 -- 9 6=5+1 10 那么推下去可知 11 表示12这个面值需要的货币数,等于表示11或7或5或2需要的货币数+1. 12 那么题中若要求表示12所需用的最小货币数,只需寻找表示11或7或5或2需要的货币数中的最小值. 13 14 */ 15 16

最少硬币问题

<<问题描述: 有n种不同面值的硬币,各硬币面值存于数组T[1:n];现用这些面值的钱来找钱:各面值的个数存在数组Num[1:n]中. 对于给定的1<=n<=10,硬币面值数组.各面值的个数及钱数m,0<=m<=2001,编程计算找钱m的最少硬币数. input : 第一个数字n,后面n行每行两个数,面值T[i],面值个数Num[i];最后是钱数m. output:最少硬币数. Sample intput :             3             1 3

编程算法之硬币问题 代码(C)

题目: 有1, 5, 10, 50, 100, 500元硬币各若干枚, 现在要用这些硬币来支付A元, 最少需要多少枚硬币? 假定本题至少存在一种支付方案. 使用贪心算法, 优先选用最大的硬币, 并不断的调整硬币的数量. 代码: /* * main.cpp * * Created on: 2014.7.17 * Author: spike */ /*eclipse cdt, gcc 4.8.1*/ #include <stdio.h> #include <limits.h> #inc

NYOJ995硬币找零(简单dp)

/* 题意:给你不同面额的硬币(每种硬币无限多),需要找零的面值是T,用这些硬币进行找零, 如果T恰好能被找零,输出最少需要的硬币的数目!否则请输出剩下钱数最少的找零方案中的最少硬币数! 思路:转换成完全背包的问题! */ #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #define INF 0x3f3f3f3f using namespace std; i

递归笔试题

1.一个楼梯有20级,每次走1级或是2级,从底走到顶一共有多少中走法? 算法:     设 n 是阶数,f(n) 是上 n 阶的不同走法数,则第一步可以走一阶或者是两阶,     那么这三种情况下剩余的阶数分别为 n-1.n-2,     所以 f(n) = f(n-1) + f(n-2). //递归解法 int solution1(int n) { if(n == 0 || n == 1) return 1; else return solution1(n-1) + solution1(n-2

蓝桥杯-历届试题 翻硬币

历届试题 翻硬币   时间限制:1.0s   内存限制:256.0MB        问题描述 小明正在玩一个"翻硬币"的游戏. 桌上放着排成一排的若干硬币.我们用 * 表示正面,用 o 表示反面(是小写字母,不是零). 比如,可能情形是:**oo***oooo 如果同时翻转左边的两个硬币,则变为:oooo***oooo 现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢? 我们约定:把翻动相邻的两个硬币叫做一步

同时-IIS 搭建FTP服务 文件传输受限

问题描述 IIS 搭建FTP服务 文件传输受限 在内网中一台PC机上使用IIS搭建FTP服务,在测试文件传输的时候发现最多只允许两个下载 其它请求都在排队,不知道这个是在哪里设置的?

IdeaPad Y400&amp;amp;Y500 Win8下无线受限问题的操作指导

  问题描述: 使用Y400/Y500,预装windows 8系统下,连接家用路由器AP,高概率的出现无线受限,无法上网的情况,出现问题后需要重新连接WiFi,右下角出现网络叹号图标.如下图: 经分析,用户机型配置的无线网卡为Broadcam 4313.此问题可以通过更改无线网卡属性来解决, 网卡与路由器的兼容性和微软的最新window 8操作系统导致了这样的问题出现,并不是机器的硬件故障. 操作步骤: 步骤一:将无线网卡的自动节电的选项关闭 点击"设备管理器",选择"无线网

win8无线网络受限怎么办?

    win8无线网络受限怎么办? 预装Win8系统的笔记本,使用过程中往往会遇到有线或无线网络连接时提示"网络受限"的情况. 方法/步骤 1在桌面状态下按下键盘的Win+X 组合键; 2屏幕左下角会弹出一个快捷栏菜单,请您使用鼠标左键单击其中的"命令提示符(管理员)",打开命令提示符窗口; 3开启命令提示符后,请依据提示输入下列英文命令: 4首先输入:"netsh int tcp set heuristics disabled"点击回车; 5