题目
有一只特别贪吃的大嘴,她很喜欢吃一种小蛋糕,而每一个小蛋糕有一个美味度,而大嘴是很傲娇的,一定要吃美味度和刚好为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;
}