硬币问题
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = 1000 + 5;
bool G[maxn][maxn];
int base[maxn];
int sd[maxn], ld[maxn];
int main(){
int n, m;
cin >> n >> m;
for(int i = 0; i < m; i++) cin >> base[i];
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++) G[i][i+base[j]] = true;
memset(sd, n, sizeof(sd));
memset(ld, 0, sizeof(ld));
sd[n] = ld[n] = 0;
for(int i = n; i > 0; i--)
for(int j = 0; j < m; j++){
if(sd[i] == n) break;
if(G[i-base[j]][i]) sd[i-base[j]] = min(sd[i-base[j]] , sd[i] + 1);
}
for(int i = n; i > 0; i--)
for(int j = 0; j < m; j++){
if(G[i-base[j]][i]) ld[i-base[j]] = max(ld[i-base[j]] , ld[i] + 1);
}
cout << sd[0] << endl;
cout << ld[0] << endl;
}