#include <iostream> #include <cstring> using namespace std; int f[301]; int n, c; int main() { while(cin >> n >> c) { memset(f, 0, sizeof(f)); f[0] = 1; for(int i = 0; i < c; i++){ int tmp; cin >> tmp; for(int j = tmp; j <= n; j++) { f[j] += f[j - tmp]; } } cout << f[n] << endl; } return 0; } 其实我第一次做是用搜索做的,可能数据比较水。过了。不过时间用了0.45s,DP就0s; #include <iostream> using namespace std; int n, c, count; int coins[300]; void _find(int sum, int cur) { sum -= coins[cur]; for(int i = 0; (sum = sum + coins[cur]) <= n; i++) { if(sum == n) { count++; return; } if(cur < c - 1) _find(sum, cur + 1); } } int main() { while(cin >> n >> c) { for(int i = 0; i < c; i++) cin >> coins[i]; count = 0; _find(0, 0); cout << count << endl; } return 0; }