1018 - 统计硬币
时间限制 : 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)