背包问题
01背包
特点, 每种物品只有一个
一个很生动的理解递归和动态规划的笔记
一位数组空间优化
void OneZeroPack ( int val[], int wei[], int n, int m ) {
for ( int i = 0; i < n; ++i ) {
for ( int j = m; j >= wei[i]; --j ) {
dp[j] = max( dp[j], dp[j-wei[i]]+val[i] );
}
}
}
二维数组 + 路径输出
for ( int i = 0; i < n; ++i ) {
for ( int j = 1; j <= m; ++j ) {
dp[i][j] = j < wei[i] ? dp[i-1][j] : max( dp[i-1][j], dp[i-1][j-wei[i]]+val[i] );
}
}
cout << dp[n-1][m] << endl;
int tmp_m = m;
for ( int i = n-1; i >= 0; --i ) {
if ( dp[i][tmp_m] > dp[i-1][tmp_m] ) {
num[i] = true;
tmp_m -= wei[i];
} else {<