邮票组合
题目描述
某人有 mm 张 3 分的邮票和 nn 张 5 分的邮票,用这些邮票中的一张或若干张(也可以是 0 张)可以得到多少种不同的大于 0 的邮资?
请找出可能组合的邮资方案总数,并按照由小到大的顺序输出所有不重复的大于 0 的方案!(5.1.97)
如:11 张 33 分和 11 张 55 分可能的邮资组合如下
0 张 3 分 ++ 1 张 5 分 == 5 分
1 张 3 分 ++ 0 张 5 分 == 3 分
1 张 3分 ++ 1张 5 分 == 8 分
因此,可能的方案有 3种,排序后的结果是:3 5 8 。
输入
两个整数,mm 和 nn ,分别代表了 33 分和 55 分的邮票的数量!(1 <=m,n<=100)
输出
输出有两行,第一行输出这两种邮票能组合的不同的大于 00 的邮资方案,数与数之间用空格隔开。
第二行输出可能的方案总数。
思路
首先,这是一道要我们用方法找出全部组合的问题。毫无疑问,数组就是这种问题最好的解决方法。我们一开始就要计算出所有组合的最大值800,再对m和n两个变量,之后再用桶排的方法,讲数组的下标表示数字,里面将计算过一次或多次的数放1,之后再将数组进行循环输出,里面的不为零的数就可以输出数组下标就行了。
代码
#include<bits/stdc++.h>
using namespace std;
int m,n,ans,a[810];
int main()
{
cin>>m>>n;
for(int i=0;i<=n;i++)
{
for(int j=0;j<=m;j++)
if((5*i+3*j)!=0)
{
a[5*i+3*j]=1;
}
}
for(int i=1;i<=800;i++)
if(a[i]!=0)
{
cout<<i<<" ";
ans++;
}
cout<<endl;
cout<<ans;
return 0;
}