题目背景
(本道题目隐藏了两首歌名,找找看哪~~~)
《爱与愁的故事第一弹·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 81 7 2 5 4
输出样例#1:
4
说明
100%数据:m<=30,r<=m,m<=ai<=90 n<=2700
时限:前两个点1秒,中间两个点3秒,最后一个点6秒。
思路:动规
#include#include #include #include using namespace std;int n,m,T,sum;int num[40],vis[40];void dfs(int tot,int s,int pre){ if(tot==m){ if(s>T) sum++; return ; } for(int i=pre+1;i<=n;i++) if(!vis[i]){ vis[i]=1; dfs(tot+1,s+num[i],i); vis[i]=0; }}int main(){ scanf("%d%d%d",&n,&m,&T); for(int i=1;i<=n;i++) scanf("%d",&num[i]); dfs(0,0,0); cout<
#include#include #include #include using namespace std;int n,m,T;int sum,ans;int num[40];int f[40][3000];int main(){ scanf("%d%d%d",&n,&m,&T); for(int i=1;i<=n;i++) scanf("%d",&num[i]),sum+=num[i]; f[0][0]=1; for(int i=1;i<=n;i++) for(int j=m;j>=1;j--) for(int k=num[i];k<=sum;k++) f[j][k]+=f[j-1][k-num[i]]; for(int i=T+1;i<=sum;i++) ans+=f[m][i]; cout<