问题描述:
给一个m,n,接下来给出n个正整数表示邮票的面值,问可凑够面值m所需的最小邮票数,无法满足则输出0
input:
10 3
1 2 4
output:
3
思路:
DFS的编写从1.限制条件 2.更新条件 3.递归条件(index<n)三方面考虑
AC代码
#include <stdio.h>
#define N 30
int flag;//初始化为0表示不存在
int num;
int min;
int len;//数组a的长度
int a[N];
void DFS(int index,int sum,int count)//
{
if(sum>num||count>=min)return;//不满足题意
if(sum==num&&count<min){
min=count;
flag=1;
}
if(index<len){
DFS(index,sum+a[index],count+1);//继续选择该元素
DFS(index+1,sum,count);
//DFS(index+1,sum+a[index],count+1); 可不用该语句
}
}
int main()
{
freopen("input.txt","r",stdin);
while(scanf("%d %d",&num,&len)!=EOF)
{
flag=0;min=100000000;//初始化
for(int i=0;i<len;i++){
scanf("%d",&a[i]);//建立数组
}
DFS(0,0,0);
if(flag==0){
printf("0\n");
return 0;
}
printf("%d\n",min);
}
}