题目 1566: 贪吃的大嘴

题目

有一只特别贪吃的大嘴,她很喜欢吃一种小蛋糕,而每一个小蛋糕有一个美味度,而大嘴是很傲娇的,一定要吃美味度和刚好为m的小蛋糕,而且大嘴还特别懒,她希望通过吃数量最少的小蛋糕达到这个目的.所以她希望你能设计一个程序帮她决定要吃哪些小蛋糕.

输入
先输入一行包含2个整数m、n,表示大嘴需要吃美味度和为m的小蛋糕,而小蛋糕一共有n种,下面输入n行,每行2个整数,第一个表示该种小蛋糕的美味度,第二个表示蛋糕店中该种小蛋糕的总数

数据规模和约定
m ≤ 20000,小蛋糕总数量≤50.

输出
输出一行包含一个整数表示大嘴最少需要吃的小蛋糕数量,若大嘴无法通过吃小蛋糕达到m的美味度和,则输出" > < “.

样例输入

10 2
4 1
2 10

样例输出

4

解题思路

本题数据规模不大,可以采用深度优先搜索,每一次调用递归函数,都选取一块“蛋糕”,并更新蛋糕数目和美味度,当美味度恰好达到要求时,统计所吃的蛋糕数目;若未达到美味度要求,继续选择蛋糕。

代码

#include<stdio.h>
int a[20001];//美味度为i的食品,数目为a[i]
int min=100000;
void DFS(int left, int eat, int num){
    int i;
    if (left==0)
        min  = (min>num)?num:min;
    else
    {
        for (i=eat;i<=left;i++)
            if (a[i]>0)
            {
                a[i]--;
                DFS(left-i,i,num+1);
                a[i]++;//回溯
            }     
    }
}

int main()
{
	int i,m,n;//美味度要求,蛋糕种类数
	int temp1,temp2;
	scanf("%d %d",&m,&n);
	for (i=0;i<n;i++)
	{
	    scanf("%d %d",&temp1,&temp2);
	    if (temp1<=m)
	        a[temp1]+=temp2;
	}
	for (i=m;i>0;i--)
	{
	    if (a[i]!=0)
	    {
	        a[i]--;
	        DFS(m-i,i,1);
	        a[i]++;//回溯
	    }
	}
	if (min==100000)
	    printf("><");
    else
	    printf("%d",min);
	return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值