牛客-最小邮票数
题目描述
有若干张邮票,要求从中选取最少的邮票张数凑成一个给定的总值。 如,有1分,3分,3分,3分,4分五张邮票,要求凑成10分,则使用3张邮票:3分、3分、4分即可。
输入描述:
有多组数据,对于每组数据,首先是要求凑成的邮票总值M,M<100。然后是一个数N,N〈20,表示有N张邮票。接下来是N个正整数,分别表示这N张邮票的面值,且以升序排列。
输出描述:
对于每组数据,能够凑成总值M的最少邮票张数。若无解,输出0。
示例1
输出
复制3
import java.util.Scanner; public class niuPost { public static int M; public static int N; public static int minNum; public static void main(String args[]){ Scanner in = new Scanner(System.in); while(in.hasNextInt()){ M = in.nextInt();//邮票总面值 N = in.nextInt();//邮票张数 minNum = N+1; int a[] = new int[N]; for(int i=0;i<N;i++){ a[i] = in.nextInt(); } DFS(a, -1, 0, 0); if(minNum == N+1) System.out.println(0); else System.out.println(minNum); } } public static void DFS(int a[], int index, int num, int sum){ if(index==N-1){ if(sum==M&&num<minNum) minNum = num; return; }else if(index>=N) return; else{ DFS(a, index+1, num+1, sum+a[index+1]); DFS(a, index+1, num, sum); } } }