題目描述
假設(shè)一堆由1分、2分、5分組成的n個(gè)硬幣總面值為m分,求一共有多少種可能的組合方式(某種面值的硬幣可以數(shù)量可以為0)。
輸入格式
輸入數(shù)據(jù)第一行有一個(gè)正整數(shù)T,表示有T組測試數(shù)據(jù)。接下來的T行,每行有兩個(gè)數(shù)n,m,n和m的含義同上。
輸出
對于每組測試數(shù)據(jù),請輸出可能的組合方式數(shù),每組輸出占一行。
樣例輸入
2
3?5
4?8
樣例輸出
1
2
本題的思路類似于雞兔同籠問題,所以不難想到使用幾個(gè)for循環(huán)對可能值進(jìn)行窮舉,下面是我寫的一個(gè)算法,在窮舉上略有優(yōu)化。
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
}
提交后仍有錯(cuò)誤,暫未發(fā)現(xiàn)在何處。下面是官方的算法,較之又有一些優(yōu)化。
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——坑爹的黑店 在算法上有異曲同工之妙。
另:之后又根據(jù)官方修改,仍是不過。奇怪。
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
}
?最后終于發(fā)現(xiàn)問題,關(guān)于k=n-i-j;因?yàn)閷τ趇,j的初始沒有限制,所以k可能是負(fù)值的情況沒有排除。
下面代碼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
}
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

