原题
题目背景
(本道题目隐藏了两首歌名,找找看哪~~~)
《爱与愁的故事第一弹·heartache》第三章。
爱与愁大神说这是ta的伤心指数,只不过现在好很多了,翻译只是看你无聊让你动动脑筋罢了(shit~~~)。虽然月落乌啼嘴上骂着:“我去年买了个表……纽曼表……”,但是结果还是请爱与愁大神去Pizza Hut吃了一顿。
题目描述
到了Pizza Hut,爱与愁大神由于不爽,所以存心想坑月落乌啼的钱,ta点了m样菜,每样菜ai元。月落乌啼预计只用n元,于是他让爱与愁大神重新从这m样菜中选r样。爱与愁大神还是想坑钱,于是ta打电话给你,让你编一个程序告诉ta有几种方案可以从m样菜中点取r样菜但是还能超过月落乌啼的预计n元。
输入输出格式
输入格式:
第1行:三个数 m,r,n。
第2行:m个数,每道菜需要的钱ai,两个数之间有空格。
输出格式:
只有一个整数,表示方案总数。
输入输出样例
输入样例#1:
5 2 8
1 7 2 5 4
输出样例#1:
4
说明
100%数据:m<=30,r<=m,m<=ai<=90 n<=2700
时限:前两个点1秒,中间两个点3秒,最后一个点6秒。
#include<cstdio>
const int MAXN=1005;
int m,r,n;
int a[MAXN];
int b[MAXN];
int ans;
void dfs(int t,int s,int k)
{
if(k==r)
{
if(s>n)
ans++;
return;
}
if(m-t+1<r-k)
return;
if(s>n)
{
int w=1,c=m-t+1,d=r-k,e=c-d+1;
for(int i=1;i<=d;i++)
w=w*(c-i+1)/i;
ans+=w;
return;
}
for(int i=t;i<=m;i++)
if(b[i]==0)
{
b[i]=1;
dfs(i+1,s+a[i],k+1);
b[i]=0;
}
}
int main()
{
scanf("%d%d%d",&m,&r,&n);
for(int i=1;i<=m;i++)
scanf("%d",&a[i]);
dfs(1,0,0);
printf("%d",ans);
return 0;
}