• 02背包模板


    问题描述:

           有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。

    测试: 
    输入: 
    3 5 
    3 5 
    2 10 
    2 20 
    输出: 
    40 

    这里先说一下fill的用法吧,它的头文件是<algorithm>,可以给一个数组赋同一值

        // fill(f[0],f[0]+(N+1)*(V+1),maxx);//fill给二维数组赋值
        // fill(f,f+V+1,maxx);//fill给一维数组赋值

    用二维数组写的完全背包

    //N代表数量,V代表背包的容量
        //c[i]代表第i个的价值,w[i]代表第i个的体积
        int f[N+1][V+1];
        fill(f[0],f[0]+(N+1)*(V+1),N);//fill给二维数组赋值
        for(int i=0;i<=N;i++){
            f[i][0]=0;
        }
        for(int i=0;i<=V;i++){
            f[0][i]=0;
        }
        for(int i=1;i<=N;i++){
            for(int j=0;j<=V;j++){
                if(j>=w[i]){
                    f[i][j]=max(f[i][j-w[i]]+c[i],f[i-1][j]);//选完之后还可以再选
                }
                else{
                    f[i][j]=f[i-1][j];//这个不符合就不要在考虑了
                }
            }
        }

    一维数组优化版

    //N代表数量,V代表背包的容量
        //c[i]代表第i个的价值,w[i]代表第i个的体积
        int f[V+1];
        fill(f,f+V+1,N);
        f[1]=0;
        for(int i=1;i<=N;i++){
            for(int j=w[i];j<=V;j++){
                if(j>=w[i]){
                    f[j]=max(f[j-w[i]]+c[i],f[j]);//选完之后还可以再选
                }
            }
        }

    这个就是完全背包的模板了

    最后把整个代码给出

    #include<iostream>
    #include<algorithm>
    const int N=-1e9+3;
    using namespace std;
    int main()
    {
        int N,V;
        cin >> N >> V;
        int w[N+1]={0,0};//重量
        int c[N+1]={0,0};//价值
        for(int i=1;i<=N;i++){
            cin >> w[i] >> c[i];
        }
        //N代表数量,V代表背包的容量
        //c[i]代表第i个的价值,w[i]代表第i个的体积
        int f[V+1];
        fill(f,f+V+1,N);
        f[1]=0;
        for(int i=1;i<=N;i++){
            for(int j=w[i];j<=V;j++){
                if(j>=w[i]){
                    f[j]=max(f[j-w[i]]+c[i],f[j]);//选完之后还可以再选
                }
            }
        }
        cout << f[V];
        return 0;
    }
  • 相关阅读:
    打造jQuery的高性能TreeView
    结构化日志类库 ---- Serilog库
    项目管理上的失误和应对措施
    Android分类导航
    Android破解
    Android开发入门
    安装 Android Studio 2.3 详细过程及错误解决
    Python学习思维导图
    设计模式的六大原则 ---- 理论知识
    日志的艺术(The art of logging)
  • 原文地址:https://www.cnblogs.com/sddr/p/10732864.html
Copyright © 2020-2023  润新知