题目背景 Background
Ztc真的遇上黄牛了。。。
题目描述 Description
周末Ztc想去剧场看演出,但是他没有票。这时,救世主Wzj出现了,他慷慨地愿意卖给Ztc一些票。
Wzj手上共有n张票,但每张票的费用都不一样,贪心的Ztc想要得到更多的票,但又想花费的最少,慷慨的Wzj愿意给连续的m张票。
Ztc希望你能帮助他在花钱范围内取得最大的票数。
输入输出格式 Input/output
输入格式:
输入文件tickets.in的第一行是2个整数n、f。其中(2≤n≤1000000),表示票的数目,(10≤f≤10000),表示Ztc身上的钱。
输入文件tickets.in的第一行是2个整数n、f。其中(2≤n≤1000000),表示票的数目,(10≤f≤10000),表示Ztc身上的钱。
接下来的1行,有n个整数a(1≤a≤30),表示每一张票的票价。
输出格式:
输出文件tickets.out仅一行整数m,表示Ztc能得连续的最大票数。
输出文件tickets.out仅一行整数m,表示Ztc能得连续的最大票数。
输入输出样例 Sample input/output
样例测试点#1
输入样例(tickets.in):
5 10
2 3 1 6 7
输出样例(tickets.out):
3
思路:这题呢,乍一看,有点像背包问题,选择最优解放入
可以使用递归简单点,把每张门票的价格存入数组,递归函数要有四个条件:
①如果票数没了,说明刚好买完,返回1,ans++
②如果钱没有了,返回0
③如果有钱没票,返回0
④如果上述条件都成立,继续递归,票数--,口袋里的钱减去已经买的门票的钱。
代码如下:
1 #include <stdio.h> 2 int w[100];//存放每张票的价格 3 int ans;//结果 4 int tickets(int s,int n) 5 { 6 if(s==0)//刚好买完 7 { 8 ans++;//ans++ 9 return 1;//返回1 10 } 11 else if(s<0) return 0;//如果钱都没有了,返回0 12 else if(n<=0&&s>0) return 0;//如果还有钱,但是没票卖了,返回0 13 else 14 { 15 if(tickets(s-w[n-1],n-1)==1)//如果刚好能买,身上的钱减去电影票的钱,ans++ 16 { 17 ans++; 18 return 1;//返回1 19 } 20 return tickets(n-1,s);//继续,电影票数目-- 21 } 22 } 23 int main() 24 { 25 int n,f,i; 26 //freopen("tickets.in","r",stdin); 27 //freopen("tickets.out","w",stdout); 28 scanf("%d%d",&n,&f); 29 if(f==0) return 0;//没钱了买啥子??O(∩_∩)O 30 else 31 { 32 for(i=0;i<n;i++)//输入每张票的价格 33 { 34 scanf("%d",&w[i]); 35 } 36 tickets(f,n);//传入递归函数(身上的钱,电影票数目) 37 } 38 printf("%d\n",ans); 39 return 0; 40 }