题目1209:最小邮票数DP

来源:互联网 发布:马赛克拼图软件 编辑:程序博客网 时间:2024/05/01 01:08

题目1209:最小邮票数

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:2825

解决:956

题目描述:

    有若干张邮票,要求从中选取最少的邮票张数凑成一个给定的总值。
    如,有1分,3分,3分,3分,4分五张邮票,要求凑成10分,则使用3张邮票:3分、3分、4分即可。

输入:

    有多组数据,对于每组数据,首先是要求凑成的邮票总值M,M<100。然后是一个数N,N〈20,表示有N张邮票。接下来是N个正整数,分别表示这N张邮票的面值,且以升序排列。

输出:

      对于每组数据,能够凑成总值M的最少邮票张数。若无解,输出0。

样例输入:
1051 3 3 3 4
样例输出:
3
import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.StringTokenizer;public class Main {    public static void main(String[] args) {    new Task().solve() ;  }}class Task{InputReader in = new InputReader(System.in) ;PrintWriter out = new PrintWriter(System.out) ;void solve(){while(in.hasNext()){int m = in.nextInt() ;int n = in.nextInt() ;int[] dp = new int[m+1] ;Arrays.fill(dp , Integer.MAX_VALUE) ;dp[0] = 0 ;while(n-- > 0){int v = in.nextInt() ;if(v > m) continue ;for(int i = Math.max(0 , m - v) ; i >= 0 ; i--){if(dp[i] != Integer.MAX_VALUE){dp[i+v] = Math.min(dp[i+v] , dp[i] + 1) ;}}}out.println(dp[m] == Integer.MAX_VALUE ? 0 : dp[m]) ;//out.flush();}out.flush();}}class InputReader {      public BufferedReader reader;      public StringTokenizer tokenizer;        public InputReader(InputStream stream) {          reader = new BufferedReader(new InputStreamReader(stream), 32768);          tokenizer = new StringTokenizer("");      }        private void eat(String s) {          tokenizer = new StringTokenizer(s);      }        public String nextLine() {          try {              return reader.readLine();          } catch (Exception e) {              return null;          }      }        public boolean hasNext() {          while (!tokenizer.hasMoreTokens()) {              String s = nextLine();              if (s == null)                  return false;              eat(s);          }          return true;      }        public String next() {          hasNext();          return tokenizer.nextToken();      }        public int nextInt() {          return Integer.parseInt(next());      }        public long nextLong() {          return Long.parseLong(next());      }        public double nextDouble() {          return Double.parseDouble(next());      }        public BigInteger nextBigInteger() {          return new BigInteger(next());      }    }  




0 0
原创粉丝点击