解法一:复杂度较大,有三个for循环
#include <iostream>
using namespace std;
int w[50], c[50], dp[210];
int main() {
int m, n;
cin >> m >> n;
for (int i = 1;i <= n;i++) {
cin >> w[i] >> c[i];
}
for (int i = 1;i <= n;i++)
for (int j = m;j >= 1;j--) //逆向
for (int k = 0;k <= j / w[i];k++)
dp[j] = max(dp[j], dp[j - k * w[i]] + k * c[i]);
cout <<"max=" << dp[m];
return 0;
}
解法二:更优
#include <iostream>
using namespace std;
//完全背包代码
int w[50], c[50], dp[210];
int main() {
int m, n;
cin >> m >> n;
for (int i = 1;i <= n;i++) {
cin >> w[i] >> c[i];
}
for (int i = 1;i <= n;i++)
for (int j = w[i];j <= m;j++) {//顺向
dp[j] = max(dp[j], dp[j - w[i]] + c[i]);
}
cout << "max=" << dp[m];
return 0;
}