AcWing 2. 01背包问题

AcWing 2. 01背包问题

 

朴素

//朴素二维
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1010;
int n, m;
int v[N], w[N];
int f[N][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=0; j<=m; j++) {//最大容量 
        //讲 f[i][j]分为f[i-1][j](去掉第i个)和 f[i-1][j-v[i]]+w[i](先去掉第i个,并减去他的质量,再加上) 
            f[i][j]=f[i-1][j];//左边
            //右边 
            //当j<v[i]时,情况不存在,就不用考虑 
            if(j>=v[i]) f[i][j]=max(f[i][j],f[i-1][j-v[i]]+w[i]);
        }
    cout<<f[n][m]<<endl;
    return 0;
}

 

优化

//一维优化
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1010;
int n, m;
int v[N], w[N];
int f[N];
int main() {
    cin >> m >> n;//m表示时间,n表示数量
    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]);
    cout << f[m];
    return 0;
}

 

 

AcWing 2. 01背包问题

上一篇:AcWing 5. 多重背包问题 II


下一篇:C# .NET的BinaryFormatter、protobuf-net、Newtonsoft.Json以及自己写的序列化方法序列化效率和序列化后的文件体积大小对比