Problem 0154 : Sum of Cards

Sum of Cards
http://rose.u-aizu.ac.jp/onlinejudge/ProblemSet/description.jsp?id=0154

  • 問題概要

書いてある数字の違う数種類のカードが与えられて、そのカードの合計で数字を作る。
枚数は任意である。
与えられた数字を作る組み合わせは何通りあるか。

  • 解法

DFSで全部つくった。
最初DPでしようとしていたが断念。
DFSの方が簡潔にできることに気づいた。

  • ソース
#include<iostream>
#include<algorithm>

#define MAX 1001

using namespace std;
int v[7], num[7], n;  
int t[MAX];

void dfs(int now, int sum){
  if( now == n){
    t[sum]++;
    return;
  }
  for(int i=0; i<=num[now]; i++){
    int tmp = sum + v[now] * i;
    if(tmp >= MAX)return;
    dfs(now + 1, tmp);
  }
}
main(){


  while(cin >> n){
    if(n == 0)break;
    

    for(int i=0; i<n; i++){
      cin >> v[i] >> num[i];
    }

    fill(t, t + MAX, 0);

    dfs(0, 0);
    
    cin >> n;

    for(int i=0; i<n; i++){
      int tmp;
      cin >> tmp;
       cout << t[tmp] << endl;
    }
  }
}