动态规划0/1背包问题和数字三角形

 


 

 

#include

#include

#define MAX 101

using namespace std;

int D[MAX][MAX];

int minSum[MAX][MAX];

int n;

int MinSum(int i, int j)

{

   if (minSum[i][j] != -1)

       return minSum[i][j];

   if (i == n)

       return D[i][j];

   int x = MinSum(i + 1, j);

   int y = MinSum(i + 1, j + 1);

   return min(x, y) + D[i][j];

}

int main()

{

   int i, j;

   cout<<"请输入三角形的行数"<

   cin >> n;

   for (i = 1; i <= n; i++)

       for (j = 1; j <= i; j++)

              {

           cin >> D[i][j];

           minSum[i][j] = -1;

       }

   cout <<"最短路径长为:"<

       system("pause");

}

 

#include

#include

#include

using namespace std;

stack KnapSack(intc,vector w,vector v,int &max_m)

{

   vector > m(w.size(),vector(c+1));

   stack res;

   int i,j;

   max_m=0;

   for(j=0;j对于m[n][j]

       if(j

           m[w.size()-1][j]=0;  //j时,物品n不能放入背包中,此时背包的价值为。

       else

           m[w.size()-1][j]=v[v.size()-1]; //j>=w[n]时,物品n可以放入背包,此时背包的价值为v[n]

   for(i=w.size()-2;i>=0;i--) //对于m[i][j]

    {

       for(j=0;j

           if(j          //j时,物品i不能放入背包中,此时背包的价值为m[i+1][j]

                m[i][j]=m[i+1][j];

           else                //j>=w[i]时,物品n可以放入背包

           {

                int m1=m[i+1][j];  //当物品i不放入背包时,能达到的最大价值为m[i+1][j]

                intm2=m[i+1][j-w[i]]+v[i];  //当物品i放入背包后,对于物品i+1n,能达到的最大价值为m[i+1][j-w[i]]+v[i]

                m[i][j]=m1>m2?m1:m2;         //两者取其大者      

           }   

    }

/*   cout << "最优值矩阵:"<

   for(i=0;i

    {

       for(j=0;j

           cout<

       cout <

   }   

   cout <

   */

   j=c;

   for(i=0;i

    {

       if(m[i][j]!=m[i+1][j])

       {

           res.push(i+1);

           max_m+=v[i];

           j=j-w[i];       

       }

   }   

   if(m[w.size()-1][j]!=0)

    {

       res.push(w.size());

       max_m+=v[w.size()-1];

   }   

       

   return res;   

}

int main()

{

   vector weight;

   vector value;

   stack  result;

   int max_weight;

   int tmp;

   int result_m=0;

   cout<< "输入背包最大容量"<

   cin >> max_weight;

   cout <<"输入物品重量,以结束"<

   while(1)

    {

       cin>>tmp;

       if(tmp!=0)

           weight.push_back(tmp);

       else

           break;

   }   

   cout <<"物品重量: "<

    for(inti=0;i

       cout <

   cout << endl;

   cout <<"输入物品权重,以结束"<

   while(1)

    {

       cin>>tmp;

       if(tmp!=0)

           value.push_back(tmp);

       else

           break;

    }

   cout <<"物品权重: "<

   for(int i=0;i

       cout <

   cout << endl;

   result=KnapSack(max_weight,weight,value,result_m);

   cout <<"放入背包的物品为:"<

   while(!result.empty())

    {

       cout <

       result.pop();

    }

   cout <

   cout<<"背包最大价值为:"<

   return 0;

}

你可能感兴趣的:(动态规划0/1背包问题和数字三角形)