描述:
一个背包容量为c ,现有n件物品,求能装入背包的最大重量是多少?
输入:
先输入两个正整数n、c(0<n、c<1000),表示物品的件数和背包容量,
再输入n个正整数,分别是这n件物品的重量。
输出:
输出能装入背包的最大重量。
样例
输入样例:
5 50
23 18 13 35 24
输出样例:
48
上代码:
#include <iostream>
using namespace std;
int weight[1001];
int dp[1001] = { 0 }; //存最优解的数组,下标表示背包容量
int n, c;
int outmax(int a, int b) { return (a > b ? a : b); }
//懒得用别的库,自己写的取最大值函数
int main() {
int i, j;
cin >> n >> c;
for (i = 1; i <= n; i++) {
cin >> weight[i];
}
for (i = 1; i <= n; i++) {
for (j = c; j >= weight[i]; j--) {
//这里做了一个优化,空间复杂度为线性。如果正序遍历会造成数据覆盖,应逆序遍历。
dp[j] = outmax(dp[j], dp[j - weight[i]] + weight[i]);
//取与不取之后比较重量,取最重解
}
}
cout << dp[c] << endl;
}
没有注释的版本:
#include <iostream>
using namespace std;
int weight[1001];
int dp[1001] = { 0 };
int n, c;
int outmax(int a, int b) { return (a > b ? a : b); }
int main() {
int i, j;
cin >> n >> c;
for (i = 1; i <= n; i++) {
cin >> weight[i];
}
for (i = 1; i <= n; i++) {
for (j = c; j >= weight[i]; j--) {
dp[j] = outmax(dp[j], dp[j - weight[i]] + weight[i]);
}
}
cout << dp[c] << endl;
}