2138 - Vending Machine

問題

N種類のコインを使ってm円のお釣りを支払う。
違う種類のコインなら1つの操作で支払うことが出来る。
このとき操作の最小回数を求めよ。

制約

N<=10
M<=100000

解法

1回の操作での支払い方は2^N通りある。
2^N種類のコインがある場合の普通のお釣りDPをすればいい。
計算量はO(2^N*M)で怪しいかと思ったけど普通に通った。

ソース
int v[1<<10];
int dp[100001];

int main() {
  int n,m;
  while(cin>>n>>m,n||m) {
    int a[n];
    REP(i,n) cin >> a[i];
    REP(S,1<<n) {
      int s=0;
      REP(i,n) if (S>>i&1) s+=a[i];
      v[S]=s;
    }
    REP(i,m+1)dp[i]=INF;
    dp[0] = 0;
    for (int S=1; S<(1<<n); ++S) {
      for (int i=0; i+v[S]<=m; ++i)
        dp[i+v[S]] = min(dp[i+v[S]], dp[i]+1);
    }
    cout << dp[m] << endl;
  }
}