普通实现方式
#include <iostream>
using namespace std;
const int n = 5;
const int c = 10;
int w[] = {0,2,2,6,5,4};
int v[] = {0,6,3,5,4,6};
int m[n+2][c+2];
int x[n+1];
int pack(void){
for (int i = n; i > 0; --i) {
for (int j = 0; j <= c; ++j) {
if (j >= w[i])
m[i][j] = max(m[i+1][j],m[i+1][j-w[i]]+v[i]);
else
m[i][j] = m[i+1][j];
}
}
}
void trace(void){
int cv = c;
for (int i = n; i >= 1; --i) {
if (m[i][cv] == m[i+1][cv])
x[i] = 0;
else{
cv -= w[i];
x[i] = 1;
}
}
for (int j = 1; j <= n; ++j) {
cout << x[j] ;
}
cout << endl;
}
int main() {
for (int i = 0; i < n+2 ; ++i) {
for (int j = 0; j < c+2; ++j) {
m[i][j] = 0;
}
}
pack();
trace();
cout << m[1][c] << endl;
return 0;
}
一维数组优化
#include <iostream>
using namespace std;
const int n = 5;
const int c = 10;
int w[] = {0,2,2,6,5,4};
int v[] = {0,6,3,5,4,6};
int m[c+2];
int x[n+1];
int pack(void){
for (int i = n; i > 0; --i) {
for (int j = c; j >= 0; --j) {
if (j >= w[i]) {
int tmp = m[j];
m[j] = max(m[j], m[j - w[i]] + v[i]);
if (m[j] != tmp)
x[i] = 1;
else
x[i] = 0;
}
}
}
}
int main() {
for (int j = 0; j < c+2; ++j) {
m[j] = 0;
}
pack();
cout << m[c] << endl;
for (int i = 1; i <= n; ++i) {
cout << x[i] <<" ";
}
return 0;
}