DTDOI - Đổi tiền

Tags: greedy, dp, sortings

Problem

https://vn.spoj.com/problems/DTDOI

https://oj.vnoi.info/problem/DTDOI

Bạn được cho một tập hợp các mệnh giá tiền. Tập hợp luôn chứa phần tử mang gía trị 1. Mỗi mệnh giá có vô hạn các đồng tiền mang mệnh giá đó. Cho số tiền S, hãy tìm cách đổi S thành ít đồng tiền nhất, sao cho mỗi đồng tiền có mệnh giá thuộc vào tập hợp đã cho.

Input

Dữ liệu vào gồm 2 dòng:

  • Dòng 1: Hai số nguyên dương N (số phần tử của tập hợp mệnh giá tiền) và S (số tiền cần đổi) (1 ≤ N ≤ 100; 1 ≤ S ≤ 10^9 ).
  • Dòng 2: N số nguyên dương biểu thị mệnh giá của các phần tử trong tập hợp (giá trị không vượt quá 100).

Output

Dữ liệu ra gồm một số nguyên duy nhất là số đồng tiền ít nhất có thể đổi được.

Example

Input  
2 3  
1 2  
  
Output  
2  

Tutorial

Nếu S giới hạn nhỏ lại thì bài này là bài toán đổi tiền cơ bản bằng QHĐ, Nhưng do S lớn nên QHĐ sẽ không thể thực hiện được.

Điều đó khiến ta nghĩ theo một hướng khác.

Nhận xét khi S cực lớn luôn thì ta dùng nhiều tờ lớn nhất nhất để rút cho đến khi thực sự cần đến những tờ nhỏ (do tiền nhỏ mà S lại lớn quá). Do đó tham lam loại cuối cùng.

Sau đó, khi S nhỏ lại thì QHĐ tìm giá trị đó. Có thể khởi tạo F[] khoảng 1 giây (chạy 10^6 cho hai vòng lặp)


Submission

DTDOI.cpp