首页 > 试题广场 >

有足够量的2分、5分、1分硬币,如果想凑齐一元钱,可以有多少

[单选题]
有足够量的2分、5分、1分硬币,如果想凑齐一元钱,可以有多少种方法?
  • 541
  • 270
  • 1024
  • 128
推荐
分三类:
第一种,全单的
1.....1
2.....1
5.....1
第二种,双的
1、2......49(考虑2的个数即可)
1、5......19(考虑5的个数即可)
2、5.......9(考虑5的个数即可,5必须是偶数,即10的倍数)
第三种,三个都有
考虑5
19个5的时候,在考虑2,1个2;2个2;......2种
18个5的时候,在考虑2,.......4种
17个5的时候,在考虑2...........7种
16个5的时候,在考虑2...........9种
..
以此类推
2+4+7+9+12+14...+44+47=(2+7+12+...47)+(4+9+14+...+44)=49*5+24*9=461

461+80=541
编辑于 2015-02-03 21:04:13 回复(2)
可以暂时不用考虑1的个数,我们假设2分的个数是x个,5分的个数是y个。显然0<x<=50,0<=y<=20且都是整数,我们可以用公式100-2x-5y>=0表示整个可取区域,画对应的函数图(略),求得0<x<=50,0<=y<=20对应的方形区域中整数二维点的个数是21*51 = 1071个。然而函数线下方和落在函数线上(不是上方)的坐标点(x,y)才是合法的点,去掉函数线上的合法坐标点,个数为11个,分别是(0,20)(5,18)(10,16)(15,14)(20,12)(25,10)(30,8)(35,6)(40,4)(45,2)(50,0),因为在函数线上方的都是非法解,所以应该去掉一半。即(1071-11)/2=530 。故总的合法解为530+11 = 541个。
ps:本想画图的,偷懒没画,大家将就着看吧^ ^。
发表于 2015-09-04 11:33:39 回复(11)
sqq头像 sqq
先将元分成100个1分,即100=1+1……+1+1,是为1种情况。接下来对100个1合并成2或者5即可——
先看合并成2:合并两个1=1+1……+2;合并4个1= 1+1……+2+2;合并6个1= 1+1……+2+2+2……共有100/2=50种情况。
在看合并5:合并成 1 5 = 1+1……+5;合并成2个5= 1+1……+5+5;……共100/5=20种情况。
而对于合并成5的情况中,剩下的1也可以合并成若干个2:1个5的能合并[95/2]=47种; 2个5的能合并[90/2]=45种;3 个5的能合并[85/2]=42种;……奇数位、偶数位分别是等差数列47、45、42、37、……7、5、2、0,和为470。
所以总共为1+50+20+470=541种。
编辑于 2015-09-28 17:28:37 回复(4)
对于这种问题,直接估算,先不管1分的(不够1分来凑即可),2分的有x个,5分的有y个,则2*x+5*y <= 100(x>=0,y>=0),总共大概有500个点。所以选A
发表于 2016-09-19 10:46:40 回复(0)
都没get到这个题的精髓,如果把一元(100分)改成(142548分)或者改成(n分)又该怎么算呢?
其实只要求(1+x+x^2+x^3+...)(1+x^2+x^4+...)(1+x^5+x^10+...)展开式中x^n的系数就是答案!
没错,就是用Generating Function!
发表于 2016-11-19 11:06:16 回复(2)
以5分为基础考虑,共有0个5分,1个5分,……20个5分这些情况。
0个5分:考虑2分,共有0个2分,1个2分,……50个2分这些情况,所以有a1=51种
1个5分:剩余95分至少要有1个1分,其余可以有0个……47个2分,所以b1=48种
2个5分:共有0个2分,1个2分,……45个2分这些情况,所以有a2=46种
3 个5分:剩余85分至少要有1个1分,其余可以有0个……42个2分,所以b2=43种

可以发现,a序列为首项为1公差为5末项为51的等差数列,其和为286;
b序列为首项为3公差为5末项为48的等差数列,其和为255;
所以共有286+255=541种
发表于 2016-09-05 23:16:59 回复(0)
#include<iostream>
using namespace std;
int main()
{
	int a,b,c,cnt = 0;
	for(int a = 0;a<=100;++a)
		for(int b = 0;b<=100-a;++b)
			for(int c = 0;c<=100-a-2*b;++c)
				if(a+2*b+5*c==100)
					++cnt;
	cout<<cnt<<endl;
	return 0;
}

发表于 2016-08-01 11:16:43 回复(0)
依次考虑5分硬币个数为0,1,2,。。。,50的情况,在每种情况下再主考虑2分硬币的情况。
0个5分---》余100----》2分硬币个数可为0,1,2,。。。,100/2个  ---》共51种
1个5分---》余95----》2分硬币个数可为0,1,2,。。。。95/2个  ----》共(95/2)+1=48种
2个5分---》 余90 ---》2分硬币个数可为0,1,2,。。。,90/2个 ---》 共(90/2)+1=46种
i个5分 ---》 余100-5*i ---》2分硬币数可为0,1,2,。。。,(100-5*i)/2个 --》共(100-5*i)/2+1种
50个5分  ---》 余0  ---》共1种

得到的序列为51,48,46,43,41,38,36,33,31,28,26,23,21,18,16,13,11,8,6,3,1
和为541
发表于 2015-12-08 12:20:59 回复(0)
抛去1不考虑。2有50个,5有10个。2有51种情况可选。5有11种情况可选。一种2对应11种5的情况。总共有51*11=561种情况。在这561种情况中,小于100的用1去补就会构成1元。大于100的不合题意,舍去。当有48和49个2分时,一个5也不能存在。所以应该减去2*10,最后,剩余情况是541
发表于 2016-05-20 14:27:32 回复(1)
设五分、二分分别有x,y个,其实就是求三角形区域{(x,y)|5x+2y<=100,x>=0,y>=0}所包含的整点个数,分x的奇偶进行求和即可
发表于 2017-09-05 10:09:19 回复(0)
首先从5的个数出发,可能0到20个5:, 然后基于5的个数看2的个数有几种就行了: 20个5, 0个2, 即1种; 19个5, 0,1,2个2, 即3种; 同理,18个5有6种; 17个5有8种; 16个5有11种; 15个5有13种… 0个5时有51种 由此,可以终结出规律了:偶数到下一个偶数个5之间是增加5,奇数到下一个奇数个5也是增加5种 故可以得到两个数列: 数列一:通式An=5n+1,n是0-10 数列二:通式Bn=5n+3,n是0-9 两数列分别求和再相加得(1+51)*11/2+(3+48)*10/2=541 故选A
发表于 2017-08-13 16:47:43 回复(0)
Ack头像 Ack
50个2分、20个5分构成小于一元,不够的用1分来补。当20个5分时,2分0个 共1种;当19个5分时,2分可能有:0,1,2 共3种;...当有2个5分时,2分可能有0,1,2...45共46种;当有一个5分时,2分可能有:0,1,2...47共48种;当有0个5分,2分可能有:0,1,2...50共51种。所以共有1+3+...+48+51=(1+48)+(3+46)+...+(23+26)+51=49*(20/2)+51=541
发表于 2015-09-11 17:20:13 回复(0)
以2位基准,逐个分析,2的取值为0到50;
当2 取“0”时,5的情况有21种;
当2 取“1、2”时,5的情况有20种;
当2 取“3、4、5”时,5的情况有19种;
以此类推:以2位基准5的取值方式有21、20、20、19、19、19、18、18、17、17、17.。。。。。。。。2、2、1、1、1
即,除21以外,奇数有三个,偶数有两个
所以总数=2x(1+2+3+4.。。。。。。+20)+(1+3+5+。。。。。。。。19+21)=541.
发表于 2015-08-24 13:34:26 回复(0)
兄弟,依在下愚见:
此种组合,不管怎么怎么选,只要确定其中的两种币值,第三种就是确定的喽。因为总和要加起来等于100嘛。为了节省时间,以先确定5的个数,在确定2的个数,1的个数自行确定。当5的个数为0时,那么2的最大个数为50个,注意这里的50是2的最大个数,而总数要加上2的个数为0的情况,所以当5的个数为0时,有51种,依次类推,直到5的个数为20,然后加起来就是了。
发表于 2018-11-06 14:39:57 回复(0)
按5的个数和2的个数分
第一种20个5
19个5时将(20-19)个5划分为2和1,按照2 的个数(2,1,0)有三种分法
18个5时将(20-18)个5划分为2和1,按照2 的个数(5,4,3,2,1,0)有6种分法

设5的个数为i(i=0,1,2,```,20)
2的最多个数为
n2=(20-i)*5/2;         (i=0,2,4,```,20)
      (20-i)*5/2-1/2;   (i=1,3,5,```,19)
对应的分类种数为(n2+1)
n2可以等效为
n2=5k1;   (k1=0,1,2,```,10)
      (5k2-1)/2;  (k2=1,3,5,```19)

所以总的分类数
=sum(n2+1)
=5*(0+1+2+```+10)+11 + 5/2*(1+3+5+```+19) - 1/2*10 +10
=5*(1+10)*10/2 +21 + 5/2*(1+19)*10/2 - 5
=275+21+250-5
=541
发表于 2018-04-11 14:57:34 回复(0)
代码实现
#include<iostream>
usingnamespacestd;
intmain()
{
    inta,b,c,cnt = 0;
    for(inta = 0;a<=100;++a)
        for(intb = 0;b<=100-a;++b)
            for(intc = 0;c<=100-a-2*b;++c)
                if(a+2*b+5*c==100)
                    ++cnt;
    cout<<cnt<<endl;
    return0;
}
发表于 2017-09-08 09:45:20 回复(0)
void main()
{
int i=0;
for(int z=0;z<=100;++z)
for(int x=0;x<=50;++x)
for (int y=0;y<=20;++y)
if(2*x+5*y+z==100)
{
i++;
cout << x << " " << y << " " << z << endl;
}
    cout << i << endl;
}
发表于 2017-05-27 13:45:02 回复(0)
#include<stdio.h>
void ways(int w) {
	int sum = 0;
	printf("5分 2分 1分\n");
	for (int i = 0; i <= w / 5; i++){	//5分的
		for (int j = 0; j <= ((w - i * 5) / 2); j++) {
			if (w - i * 5 - j * 2>=0) {
				printf("%d   %d   %d\n", i, j, w - i * 5 - j * 2);
				sum++;			
			}
		}		
	}
	printf("共有%d种方法\n", sum);
}
int main() {
	int w=100;
	ways(w);
	return 0;
}

发表于 2017-03-18 23:28:16 回复(1)
int sum = 0 ;
for(int a = 0 ; a <= 100 ; a++){
for(int b = 0 ; b <=50 ; b++){
for(int c = 0 ; c <= 20 ; c++){
if(a + b*2 + c*5 == 100){
sum++;
}
}
}
}
发表于 2016-12-15 16:01:35 回复(0)
int main()
{
    int s=0;
    for(int i=0; i<=100; i++)
        for(int j=0; j<=50; j++)
            for(int k=0; k<=20; k++)
                if((i*1+j*2+k*5)==100)
                    s++;
    cout<<s<<endl;
}
我不会算。。。

发表于 2016-08-24 23:26:32 回复(0)