统计硬币

来源:互联网 发布:以下 数据库的数据模型 编辑:程序博客网 时间:2024/05/09 01:44
Problem Description
假设一堆由1分、2分、5分组成的n个硬币总面值为m分,求一共有多少种可能的组合方式(某种面值的硬币可以数量可以为0)。
 

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

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

Sample Input
23 54 8
 

Sample Output
12
法一:暴力
#include<stdio.h>main(){int i,j,k;int n,m;    int t;int sum;scanf("%d",&t);while(t--){  sum=0;scanf("%d %d",&n,&m);for(i=0;i<=m;i++)  for(j=0;j<=m/2;j++)for(k=0;k<=m/5;k++)if(i+j+k==n&&i*1+j*2+k*5==m)sum++;printf("%d\n",sum);}return 0;}


法二:母函数,利用二位数组


#include<stdio.h>#include<string.h>int c1[100][100],c2[100][100];int main(){///lfreopen("cin.txt","r",stdin);int i,j,k,l,n,m,t;scanf("%d",&t);while(t--){int sum=0;scanf("%d%d",&n,&m);memset(c1,0,sizeof(c1));memset(c2,0,sizeof(c2));for(i=0;i<=n;i++){c1[i][i]=1;}for(i=2;i<=5;i+=3){for(j=0;j<=m;j++)for(k=0;k*i+j<=m&&k<=n;k++){for(l=0;l+k<=n;l++)c2[k*i+j][k+l]+=c1[j][l];}for(j=0;j<=m;j++){for(k=0;k<=n;k++){c1[j][k]=c2[j][k];c2[j][k]=0;}}}printf("%d\n",c1[m][n]);}return 0;}



0 0
原创粉丝点击