题解 | #最小邮票数#
最小邮票数
https://www.nowcoder.com/practice/83800ae3292b4256b7349ded5f178dd1
#include <climits>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main() {
int m, n;
while (cin >> m >> n) {
vector<int> stamps(n + 1, 0);
vector<vector<int>> dp(n + 1, vector<int>(m + 1, 20));
for (int i = 1; i <= n; i ++)
cin >> stamps[i];
dp[0][0] = 0;
for (int i = 1; i <= n; i ++) {
for (int j = 0; j <= m; j ++) {//前i张邮票总和为j的最小邮票数
if (j < stamps[i]) {
dp[i][j] = dp[i - 1][j];//避免出现j - stamps[i]小于0
continue;
} else {
dp[i][j] = min(dp[i - 1][j], dp[i - 1][j - stamps[i]] + 1);//要不要选第i张邮票,试了才知道
}
}
}
if (dp[n][m] == 20)
cout << 0 << endl;
else
cout << dp[n][m] << endl;
}
return 0;
}

查看13道真题和解析