NOIP2011-普及组复赛模拟试题-第二题-买票

题目背景 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身上的钱。
接下来的1行,有n个整数a(1≤a≤30),表示每一张票的票价。
输出格式:
输出文件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 }

 

posted @ 2015-08-14 20:52  Memoryヾノ战心  阅读(788)  评论(0编辑  收藏  举报