01背包的状态转换方程 f[i,j] = Max{ f[i-1,j-Wi]+Pi( j >= Wi ), f[i-1,j] }
f[i,j]表示在前i件物品中选择若干件放在承重为 j 的背包中,可以取得的最大价值。
Pi表示第i件物品的价值,Wi表示第i件物品的重量。
决策:为了背包中物品总价值最大化,第 i件物品应该放入背包中吗 ?
#include#include using namespace std;vector v;int w[5]={ 3,3,3,3,3};int p[5]={ 5,5,5,5,5};void result(int**c,int i,int j);int main(){ int **c=new int*[6]; for(int i=0;i<6;i++) { *(c+i)=new int[11]; } for(int i=0;i<6;i++) { for(int j=0;j<11;j++) { if(i == 0 || j == 0) { c[i][j]=0; } else { if(w[i-1]>j) { c[i][j]=c[i-1][j]; } else { c[i][j]=max(c[i-1][j-w[i-1]]+p[i-1],c[i-1][j]); } } } } cout< < j) { result(c,i-1,j); } else { if(c[i-1][j-w[i-1]]+p[i-1] > c[i-1][j]) { v.push_back(i); result(c,i-1,j-w[i-1]); } else if(c[i-1][j-w[i-1]]+p[i-1] == c[i-1][j]) { vector temp(v); v.push_back(i); result(c,i-1,j-w[i-1]); v.swap(temp); result(c,i-1,j); } else { result(c,i-1,j); } }}