1018 - 统计硬币

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 32 MB

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

题目输入

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

题目输出

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

输入/输出样例

输入格式

2
3 5
4 8

输出格式

1
2

C语言解答

#include<stdio.h>

int main()
{
	int t,n,m,c1,c2,c5,k;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d",&n,&m);
		k=0;
		for(c5=0;5*c5<=m;c5++)
			for(c2=0;2*c2+5*c5<=m;c2++)
			{
				c1=m-5*c5-2*c2;
				if(c1+c2+c5==n)
					k++;
			}
		printf("%d\n",k);
	}
	return 0;
}

C++解答

#include<stdio.h>

int main()
{
	int t,n,m,c1,c2,c5,k;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d",&n,&m);
		k=0;
		for(c5=0;5*c5<=m;c5++)
			for(c2=0;2*c2+5*c5<=m;c2++)
			{
				c1=m-5*c5-2*c2;
				if(c1+c2+c5==n)
					k++;
			}
		printf("%d\n",k);
	}
	return 0;
}

Java解答

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int t = in.nextInt();
		while(t-->0){
			int n = in.nextInt();
			int m = in.nextInt();
			int cou = 0;
			for(int i=0;i<=m;i++)
				for(int j=0;j<=m/2+1;j++)
					for(int k=0;k<=m/5+1;k++){
						if(k+j>n || k+i>n || j+i>n)break;
						if(i+j+k==n && i+j*2+k*5==m)
							cou++;
					}
			System.out.println(cou);
		}
	}

}

Python解答

import sys

def check(n,m):
    s=0
    for i in xrange(n+1):
        M = m-5*i
        N = n-i
        if  N <= M <=2*N:
            s += 1
        #print i,s
    return s

for line in sys.stdin:
     data = map(lambda x:int(x),line.split())
     if len(data)==2:
        n,m=data
        print check(n,m)