代码和0-1背包非常之像,只是由原来的容量固定,求最大价值,最小邮票数是每个邮票的价值(权重)一样,都为1(枚),在背包大小固定的情况,求最少的邮票数。
// runtime: 4ms
// space: 496K
#include <iostream>
#include <algorithm>
using namespace std;
const int MAX = 100000;
int main() {
int total, n;
while (cin>> total >> n) {
int stamp[n + 1];
int dp[n + 1][total + 1]; // dp[i][j] stands for min number of
for (int i = 1; i <= n; ++i) {
cin >> stamp[i];
} // end of input
for (int i = 0; i <= n; ++i) {
for (int j = 0; j <= total; ++j) {
dp[i][j] = MAX;
}
} // initialize dp
dp[0][0] = 0; // very important
for (int i = 1; i <= n; ++i) {
for (int j = 0; j <= total; ++j) {
if (j < stamp[i]) { // can not select this stamp
dp[i][j] = dp[i - 1][j];
continue;
}
else { // select this stamp
dp[i][j] = min(dp[i - 1][j], dp[i - 1][j - stamp[i]] + 1); // +1 means plus one stamp.
}
}
}
if (dp[n][total] == MAX) // can not combined into TOTAL
cout << 0 << endl;
else
cout <<dp[n][total] << endl;
}
return 0;
}

京公网安备 11010502036488号