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;
}
复制代码

 

posted @   srcrs  阅读(124)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示