1025:统计硬币

题目描述

假设一堆由1分、2分、5分组成的n个硬币总面值为m分,求一共有多少种可能的组合方式(某种面值的硬币可以数量可以为0)。

输入格式

输入数据第一行有一个正整数T,表示有T组测试数据。接下来的T行,每行有两个数n,m,n和m的含义同上。

输出

对于每组测试数据,请输出可能的组合方式数,每组输出占一行。

样例输入

2
3 5
4 8

样例输出

1
2

本题的思路类似于鸡兔同笼问题,所以不难想到使用几个for循环对可能值进行穷举,下面是我写的一个算法,在穷举上略有优化。

 1 #include <stdio.h>
 2 int main(void)
 3 {
 4     int n,m;
 5     int time;
 6
 7     scanf("%d",&time);
 8     while(time--)
 9     {
10
11         int count=0;
12         scanf("%d %d",&n,&m);
13         int i,j,k,total;
14
15         for(i=0;i<=(m/5);i++)
16         {
17
18             for(j=0;j<=(m/2);j++)
19                 {
20                     k=n-j-i;
21                     total=k*1+j*2+i*5;
22                     if(total==m)
23                             count++;
24                 }
25
26         }
27         printf("%d\n",count);
28     }
29     return 0;
30 }

提交后仍有错误,暂未发现在何处。下面是官方的算法,较之又有一些优化。

 1 #include<stdio.h>
 2
 3 int main()
 4 {
 5         int t,n,m,c1,c2,c5,k;
 6         scanf("%d",&t);
 7         while(t--)
 8         {
 9                 scanf("%d%d",&n,&m);
10                 k=0;
11                 for(c5=0;5*c5<=m;c5++)
12                         for(c2=0;2*c2+5*c5<=m;c2++)
13                         {
14                                 c1=m-5*c5-2*c2;
15                                 if(c1+c2+c5==n)
16                                         k++;
17                         }
18                 printf("%d\n",k);
19         }
20         return 0;
21 }

另外值得一提的是,本题与1023——坑爹的黑店在算法上有异曲同工之妙。

另:之后又根据官方修改,仍是不过。奇怪。

 1 #include <stdio.h>
 2 int main(void)
 3 {
 4     int n,m;
 5     int time;
 6
 7     scanf("%d",&time);
 8     while(time--)
 9     {
10
11         int count=0;
12         scanf("%d %d",&n,&m);
13         int i,j,k,total;
14
15         for(i=0;5*i<=m;i++)
16         {
17
18             for(j=0;2*j<=m;j++)
19                 {
20                     k=n-j-i;
21                     total=k*1+j*2+i*5;
22                     if(total==m)
23                             count++;
24                 }
25
26         }
27         printf("%d\n",count);
28     }
29     return 0;
30 }

最后终于发现问题,关于k=n-i-j;因为对于i,j的初始没有限制,所以k可能是负值的情况没有排除。

下面代码AC

 1 #include <stdio.h>
 2 int main(void)
 3 {
 4     int n,m;
 5     int time;
 6
 7     scanf("%d",&time);
 8     while(time--)
 9     {
10
11         int count=0;
12         scanf("%d %d",&n,&m);
13         int i,j,k,total;
14
15         for(i=0;5*i<=m;i++)
16         {
17
18             for(j=0;2*j<=m;j++)
19                 {
20                     k=n-j-i;
21                     total=k*1+j*2+i*5;
22                     if(total==m&&k>=0)
23                     {
24
25                         count++;
26                     }
27
28                 }
29
30         }
31         printf("%d\n",count);
32     }
33     return 0;
34 }
时间: 2024-10-27 13:27:27

1025:统计硬币的相关文章

【TK】1025: 统计硬币

1025: 统计硬币 时间限制: 1 Sec  内存限制: 32 MB提交: 2409  解决: 1107[提交][状态][下载(1元)] 题目描述 假设一堆由1分.2分.5分组成的n个硬币总面值为m分,求一共有多少种可能的组合方式(某种面值的硬币可以数量可以为0). 输入 输入数据第一行有一个正整数T,表示有T组测试数据.接下来的T行,每行有两个数n,m,n和m的含义同上. 输出 对于每组测试数据,请输出可能的组合方式数,每组输出占一行. 样例输入 2 3 5 4 8 样例输出 1 2 1 0

HDU 2566 统计硬币

统计硬币 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7304    Accepted Submission(s): 5016 Problem Description 假设一堆由1分.2分.5分组成的n个硬币总面值为m分,求一共有多少种可能的组合方式(某种面值的硬币可以数量可以为0). Input 输入数据第一行有一个正整数T,表示有

HDU2566 统计硬币

统计硬币 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3837    Accepted Submission(s): 2687 Problem Description 假设一堆由1分.2分.5分组成的n个硬币总面值为m分,求一共有多少种可能的组合方式(某种面值的硬币可以数量可以为0). Input 输入数据第一行有一个正整数T,表示

统计硬币

Problem Description 假设一堆由1分.2分.5分组成的n个硬币总面值为m分,求一共有多少种可能的组合方式(某种面值的硬币可以数量可以为0). Input 输入数据第一行有一个正整数T,表示有T组测试数据:接下来的T行,每行有两个数n,m,n和m的含义同上. Output 对于每组测试数据,请输出可能的组合方式数:每组输出占一行. Sample Input 2 3 5 4 8 Sample Output 1 2 1 #include <stdio.h> 2 3 int main

【TK】1023: 坑爹的黑店

1023: 坑爹的黑店 时间限制: 1 Sec  内存限制: 32 MB提交: 2134  解决: 855[提交][状态][下载(1元)] 题目描述 今天小明去了一个风景如画的地方散心,但是自己带的饮料喝完了,小明口渴难耐,见不远处有家小商店,于是跑去买饮料. 小明:"我要买饮料!" 店主:"我们这里有三种饮料,矿泉水1.5元一瓶,可乐2元一瓶,橙汁3.5元一瓶." 小明:"好的,给我一瓶矿泉水." 说完他掏出一张N元的大钞递给店主. 店主:&q

菜鸟授徒系列之母函数

这是第二次接触母函数类问题,相比于第一次的朦朦胧胧,第二次更加深刻.深深地感到母函数的强大,真是解决组合问题的一大法宝,将做过的题分类.总结加深一下记忆. 母函数包括:  普通生成函数(解决组合问题) 指数生成函数(解决排列问题) 这里全部是普通生成函数,可解决一系列组合问题,做题时要将题意与生成函数 G(x) = (1+x^2+x^3+x^4....) (1+x^2+x^4+....) (1+x^3+x^6+.....)······.相结合. 母函数模板包括三重循环:第一重指除第一个括号外的括

杭电 2566(母函数 暴力)

统计硬币 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3841    Accepted Submission(s): 2691 Problem Description 假设一堆由1分.2分.5分组成的n个硬币总面值为m分,求一共有多少种可能的组合方式(某种面值的硬币可以数量可以为0). Input 输入数据第一行有一个正整数T,表示

UVa1640 - The Counting Problem(数位统计)

题意: 统计两个整数a,b之间各个数字(0~9)出现的次数,如1024和1032,他们之间的数字有1024 1025 1026 1027 1028 1029 1030 1031 1032 总共有10个0,10个1,3个3等等. 分析: 因为前导0的干扰,为了计算方便暂时都先计算在内,之后再减; 如果是0~199,那么百位上的0和1各出现一次,s剩下的就是两个00~99,总共两百个二位数,而每个数出现的次数都一样,都是2*(99-00+1)/10; 那么任意的数都可以分解成类似的数字,如3426,

SICP-换零钱方法的统计

[问题] 现有半美元.四分之一美元.10美分.5美分和1美分共5种硬币.若将1美元换成零钱,共有多少种不同方式? [思路] 采用递归过程,假定我们所考虑的可用硬币类型种类排了某种顺序,于是就有下面的关系: 将总数为a的现金换成n中硬币的不同方式的数目等于 将现金数a换成除第一种硬币之外的所有其他硬币的不同方式数目,加上 将现金数a-d换成所有种类的硬币的不同方式数目,其中的d是第一种硬币的币值. 注意这里将换零钱分成两组时所采用的方式,第一组里面都没有使用第一种硬币,而第二组里面都使用了第一种硬