普通实现方式
#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 ;
}