zoukankan      html  css  js  c++  java
  • 01背包问题

     1 #include <iostream>  
     2 #include <cstring>  
     3 using namespace std;  
     4 const int N=15;  
     5 int main()  
     6 {  
     7     int v[N]={0,8,10,6,3,7,2};  
     8     int w[N]={0,4,6,2,2,5,1};  
     9     int m[N][N];  
    10     int n=6,c=12;  
    11     memset(m,0,sizeof(m));  
    12     for(int i=1;i<=n;i++)  
    13     {  
    14         for(int j=1;j<=c;j++)  
    15         {  
    16             if(j>=w[i])  
    17                 m[i][j]=max(m[i-1][j],m[i-1][j-w[i]]+v[i]);  
    18             else  
    19                 m[i][j]=m[i-1][j];  
    20         }  
    21     }  
    22     for(int i=1;i<=n;i++)  
    23     {  
    24         for(int j=1;j<=c;j++)  
    25         {  
    26             cout<<m[i][j]<<' ';  
    27         }  
    28         cout<<endl;  
    29     }  
    30     return 0;  
    31 }  

    这一段代码很简单的把01背包问题最后的最大值答案求出,下面这个函数用来从后往前求最优解

     1 void traceback()
     2 {
     3     for (int i = n; i>1; i--)
     4     {
     5         if (m[i][c] == m[i - 1][c])
     6             x[i] = 0;
     7         else
     8         {
     9             x[i] = 1;
    10             c -= w[i];
    11         }
    12     }
    13     x[1] = (m[1][c]>0) ? 1 : 0;
    14 }

    完整代码如下:

     1 #include <iostream>  
     2 #include<windows.h>
     3 using namespace std;
     4 const int N = 15;
     5 int v[N] = { 0,8,10,6,3,7,2 };
     6 int w[N] = { 0,4,6,2,2,5,1 };
     7 int x[N];
     8 int m[N][N];
     9 int n = 6, c = 12;
    10 void traceback()
    11 {
    12     for (int i = n; i>1; i--)
    13     {
    14         if (m[i][c] == m[i - 1][c])
    15             x[i] = 0;
    16         else
    17         {
    18             x[i] = 1;
    19             c -= w[i];
    20         }
    21     }
    22     x[1] = (m[1][c]>0) ? 1 : 0;
    23 }
    24 
    25 int main()
    26 {
    27     
    28     memset(m, 0, sizeof(m));
    29     for (int i = 1; i <= n; i++)
    30     {
    31         for (int j = 1; j <= c; j++)
    32         {
    33             if (j >= w[i])
    34                 m[i][j] = max(m[i - 1][j], m[i - 1][j - w[i]] + v[i]);
    35             else
    36                 m[i][j] = m[i - 1][j];
    37         }
    38     }
    39 
    40     for (int i = 1; i <= n; i++)
    41     {
    42         for (int j = 1; j <= c; j++)
    43         {
    44             cout << m[i][j] << ' ';
    45         }
    46         cout << endl;
    47     }
    48     traceback();
    49     for (int i = 1; i <= n; i++)
    50         cout << x[i]<<" ";
    51     return 0;
    52 
    53 }
  • 相关阅读:
    验证码缓存问题完美解决方案
    最近项目是跟框架有关的两个问题
    未与信任 SQL Server 连接相关联
    Get请求
    Post请求
    jQuery操作元素
    Dom对象和jQuery包装集
    XMLHttpRequest对象
    jQuery事件与事件对象
    处理数据集
  • 原文地址:https://www.cnblogs.com/yuanninesuns/p/8535611.html
Copyright © 2011-2022 走看看