题目描述
小 Y 同学近来得到了一套新的砝码玩具,内含有 1g1g1g,2g2g2g,5g5g5g,10g10g10g 的砝码各若干枚(其 总重≤1000g总重 \le 1000g总重≤1000g),游戏的玩法是:由系统自动给出一个重量值,若给定的砝码能够组合成所需的重量,小 Y 要填写出一共有多少种组合方式,否则填写 cannot compose
。小 Y 同学总是找不出所有的情况,你能编个程序来帮助他吗?
输入
第一行输入 a1,a2,a3,a)4a_1, a_2, a_3, a)4a1,a2,a3,a)4,分别代表 1g1g1g,2g2g2g,5g5g5g,10g10g10g 砝码的数量。
第二行输入 weightweightweight,代表重量值。
输出
若能够组合,输出砝码一共有多少种组合方式,否则输出 cannot compose
。
输入输出样例
样例输入 #1
1 2 3 3
20
样例输出 #1
4
【代码】
#include<bits/stdc++.h>
using namespace std;
int w[4]={1,2,5,10},f[1100],wieght,a[4],num,ans;
void dfs(int p,int sum)
{
if(sum==weight)
{
ans++;
return;
}
if(p>5||sum>weight)
return;
for(int i=0;i<a[p-1];i++) //选每一种中的几个砝码
{
dfs(p+1,sum+=i*w[p-1]);
}
}
int main()
{
for(int i=0;i<4;i++)
{
cin>>a[i];
num+=a[i]*w[i];
}
cin>>weight;
if(weight>num)
{
cout<<"cannot compose";
return 0;
}
else
{
dfs(1,0);
if(ans==0)
cout<<"cannot compose";
else
cout<<ans;
}
return 0;
}