特殊的01背包问题:各物品按重量递增排列时其价值恰好按递减排序
贪心算法可以求解特殊的01背包问题得出来最优解,但是若用贪心算法解决普通的背包问题的话,一般只能求出来近似解,求不出来最优解。
动态规划动态规划解决背包问题
#include#include using namespace std; int main() { int w[4]={2,1,3,2}; int v[4]={12,10,20,15}; int c=5; int dp[4][5]; memset(dp,0,sizeof(int)*20); for(int i =0;i<4;i++) { for(int j =0;j<=c;j++) { if(i==0) dp[i][j] = (w[i]<=j) ? v[i] : 0; else{ int top = dp[i-1][j]; //上一个网格的价值 int thisval = (w[i]<=j)?(j-w[i]>0?v[i]+dp[i-1][j-w[i]]:v[i]):top; //当前商品价值+剩余空间价值 dp[i][j]=max(top,thisval); //当前状态的最佳价值 } } } cout< TSP最短链接策略 每次寻找当前节点的最短路径,并记录最短路径连接的顶点和标记该顶点已经过,下次在通过该顶点继续寻找最短路径,直到走完所有顶点为止。
#includeusing namespace std; #define n 5 int TSP(int arc[n][n],int w); int main() { int arc[n][n] = { 0, 3, 3, 2, 6, 3, 0, 7, 3, 2, 3, 7, 0, 2, 5, 2, 3, 2, 0, 3, 6, 2, 5, 3, 0 }; cout << TSP(arc, 0); return 0; } int TSP(int arc[n][n], int w) { int edgeCnt = 0, tsplen = 0;//边数和总长度 int min, u, v; int flag[n] = { 0 }; u = w; flag[u] = 1;//表示w城市访问过 while (edgeCnt " << v << endl; u = v; } cout << u << "-->" << w << endl; return tsplen + arc[u][w]; }



