zoukankan      html  css  js  c++  java
  • AcWing 3. 完全背包问题

    朴素

    #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;//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++)
                for(int k=0; k*v[i]<=j; k++)//选k个第i个物品   
                    f[i][j]=max(f[i][j],f[i-1][j-v[i]*k]+k*w[i]);
        cout<<f[n][m]<<endl;
        return 0;
    }

    优化二维

    //01背包从i-1转移过来   而完全背包是从第
    i层转移过来
    #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 ++ )
                for(int k=0; k*v[i]<=j; k++)
                    f[i][j] = max(f[i][j], f[i-1][j - v[i]*k] + w[i]*k);
        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 >> n >> m;//n是数量,m是体积 
        for (int i = 1; i <= n; i ++ )
            cin >> v[i] >> w[i];
        for (int i = 1; i <= n; i ++ )
            for (int j = v[i]; j <= m; j ++ )
                f[j] = max(f[j], f[j - v[i]] + w[i]);
        cout << f[m] << endl;
        return 0;
    }
  • 相关阅读:
    codeforces 587B
    codeforces 552E
    算法竞赛模板 字典树
    算法竞赛模板 二叉树
    算法竞赛模板 图形面积计算
    TZOJ 1545 Hurdles of 110m(动态规划)
    算法竞赛模板 判断线段相交
    算法竞赛模板 折线分割平面
    TZOJ 3005 Triangle(判断点是否在三角形内+卡精度)
    算法竞赛模板 KMP
  • 原文地址:https://www.cnblogs.com/QingyuYYYYY/p/11873177.html
Copyright © 2011-2022 走看看