您的位置:首页 > 其它

统计硬币

2015-09-16 23:06 232 查看
题目描述

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

输入格式

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

输出

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

样例输入 2 3 5 4 8

样例输出 1 2

BF的方法是先求出1,2,5可能的硬币数,然后对每种可能结果判断它们时候满足两个条件

硬币数和为n,面值和为m

#include <iostream>
#include <iomanip>
#include <cmath>
#include <cstring>
#include <cstdio>
using namespace std;

int main()
{
int l;
cin>>l;
while(l--)
{
int n,m;
cin>>n>>m;
int time=0;
int a,b,c;
for(a=m/5;a>=0;--a)
for(b=m/2;b>=0;--b)
for(c=m;c>=0;--c)
{
if(a+b+c==n && 5*a+2*b+c==m)
++time;
}

cout<<time<<endl;
}
return 0;

}


优化的方法可以先从面值最大的5考虑,在只使用给定数目的5的数目硬币时,判断剩余数目的银币数(只有1,2)和钱数是否满足

#include <iostream>
#include <iomanip>
#include <cmath>
#include <cstring>
#include <cstdio>
using namespace std;

int main()
{
int l;
cin>>l;
while(l--)
{
int n,m;
cin>>n>>m;
int time=0;
int a,b,c;
for(a=m/5;a>=0;--a)
{
b=n-a;
c=m-5*a;
if(b<=c && 2*b>=c)
++time;
}

cout<<time<<endl;
}
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: