0-1背包问题(二维,滚动数组,一维)(c++)

#include
using namespace std;

/*const int N=1010;
int f[N][N];
int n,m;
int v[N],w[N];

int main()//二维数组,这个应该都会;
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)cin>>v[i]>>w[i];
    
    for(int i=1;i<=n;i++)
       for(int j=1;j<=m;j++)
        {
             f[i][j]=f[i-1][j];
             if(j>=v[i])
                f[i][j]=max(f[i][j],f[i-1][j-v[i]]+w[i]); //其实二维数组开得太大,而且很多数据我们根本用不上.
        }
        
    int res=0;
    for(int i=1;i<=m;i++)res=max(res,f[n][i]);
   
    cout<>n>>m;
    for(int i=1;i<=n;i++)cin>>v[i]>>w[i];
    
    for(int i=1;i<=n;i++)//滚动数组,当前行和前一行数据对转移方程有用所以开个[2][N]就够了
       for(int j=1;j<=m;j++)//我对它不熟悉只能推理一下看法,最终的结果就在转移的这矩阵里面找,因为i是可能最后滚到0或者1跟n的值有关
        {
             f[i%2][j]=f[(i-1)%2][j];//所以最后搜索要全遍历,= =如果推理错了请大佬指出来我修改。
             if(j>=v[i])
                f[i%2][j]=max(f[i%2][j],f[(i-1)%2][j-v[i]]+w[i]); 
        }
        
    int res=0;
    for(int i=0;i<2;i++)
    for(int j=1;j<=m;j++)
    res=max(res,f[i][j]);
  
    cout<>n>>m;
    for(int i=1;i<=n;i++)cin>>v[i]>>w[i];
    
    for(int i=1;i<=n;i++)
       for(int j=m;j>=v[i];j--)
        f[j]=max(f[j],f[j-v[i]]+w[i]); //降为的话我们不仅空间压缩了,其实还剪枝了,像二维那些奇葩的[i][0],[i][1]数据给的体积比它大
                                        //这里通过j>=v[i]我们可以特判掉很多无用计算,保证计算的都是有效数据
                                        //然后思想其实还是根据二维数组演变来的,
        cout<

你可能感兴趣的:(dp动态规划)