Time Limit: 1 Sec Memory Limit: 128 MB
Description
HaiLin非常喜欢锻炼身体,他在淘宝上购买了一套7手的哑铃。如图所示,哑铃有不同的重量的规格。他购买的这套哑铃中只包含1、2、3、5、7、10千克的重量规格,Hailin是一个富二代,他为了炫富,每一种重量规格的哑铃各买了99999999999999999999个。他给自己制定了一个锻炼方案,每天可能会组合安装不同重量的哑铃进行锻炼身体,练出自己的八块腹肌,然后去学(Liao)习(Mei)了(Zi)。Hailin突然想到,利用n个哑铃组合成m千克的重量一共有几种方法呢?同一种哑铃可以使用任意个,因为他买了太多,肯定够用就是了。
Input
多组输入数据(10000组),每组输入两个正整数n和m,以空格分隔。n代表Hailin需要的哑铃数目,m代表他要组合的重量。其中1<=n<=10,1<=m<=1000。输入以文件尾结束。
Output
对应每组输入数据,输出不同的方案数,每组输出独占一行。
Sample Input
2 3
3 5
Sample Output
1
2
HINT
利用2个哑铃组合成3千克的方法只有一种:1个1千克的哑铃 加上 1个2千克的哑铃。
利用3个哑铃组合成5千克的方法只有两种,方法一:2个1千克的哑铃 加上 1个3千克的哑铃;方法二:1个1千克的哑铃 加上 2个2千克的哑铃。
题解:
看了提示还是以为是找规律的数学题,后来发现就是组合,套多重循环筛选出满足条件[个数][重量] 的个数。
#include <stdio.h>
int main()
{
int a[6] = {1,2,3,5,7,10};
int book[11][1001] = {0};
int i,j,k,o,p,l,n,m;
for( i = 0 ; i < 11 ; i ++ )
for( j = 0 ; j < 11 ; j ++ )
for( k = 0 ; k < 11 ; k ++ )
for( o = 0 ; o < 11 ; o ++ )
for( p = 0 ; p < 11 ; p ++ )
for( l = 0 ; l < 11 ; l ++ ){
int num = i + j + k + o + p + l;
int weight = a[0]*i + a[1]*j + a[2]*k + a[3]*o + a[4]*p + a[5]*l;
if(num < 11 && weight < 1001)
book[num][weight]++;
}
while(scanf("%d %d",&n,&m)!=EOF)
printf("%d\n",book[n][m]);
return 0;
}