01背包,完全背包模板

来源:互联网 发布:武汉火凤凰云计算基地 编辑:程序博客网 时间:2024/06/05 18:23

1. 01背包

例:一个旅行者有个最多能装m公斤的背包,现在有n件物品。它们的重量分别为w1,w2,w3,…..wn。它们的价值分别v1,v2,v3,…..vn.求背包能装的最大值。

01背包:

//dp[i][j]表示从0-i这i+1个物品中选不超过j重量的最大值void solve(){    for(i=0;i<n;i++){        for(j<0;j<=m;j++){            if(j<=w[i]){                dp[i+1][j]=dp[i][j];            }else {                dp[i+1][j]=max(dp[i][j],dp[i][j-w[i]]+v[i]);            }        }    }    cout<<dp[n][m]<<endl;}

2.完全背包

例:一个旅行者有个最多能装m公斤的背包,现在有n种物品。它们的重量分别为w1,w2,w3,…..wn。它们的价值分别v1,v2,v3,…..vn.求背包能装的最大值。每种物品可以挑选多件。

完全背包:

//dp[i][j]表示从前i种挑选不超过j重量的最大值void solve(){    for(i=0;i<n;i++){        for(j<0;j<=m;j++){            if(j<=w[i]){                dp[i+1][j]=dp[i][j];            }else {                dp[i+1][j]=max(dp[i][j],dp[i+1][j-w[i]]+v[i]);            }        }    }    cout<<dp[n][m];}

3.此外可以通过不断重复一个数组实现01背包和完全背包。

01背包:
设f[v]表示重量不超过V公斤的最大价值。则状态方程:f[v]=max{f[v],f[v-w[i]]+c[i]} 当v>=w[i]且 1<=i<=n时

#include<iostream>#include<string.h>using namespace std;const int maxn=10010;int max(int a,int b){return a>b?a:b;}int w[maxn],v[maxn],dp[maxn];int i,j,m,n;int main(){    cin>>m>>n; //m背包容量,n件物品    int i;    for(i=0;i<n;i++){        cin>>w[i]>>v[i];  //每个物品的重量,价值    }    for(i=0;i<n;i++){        for(j=m;j>=w[i];j--){            dp[j]=max(dp[j],dp[j-w[i]]+v[i]);        }    }            //dp[m]表示重量不超过m的最大价值.    cout<<dp[m]<<endl; //dp[m]为最优解    return 0;}

完全背包:

void solve(){    for(i=0;i<n;i++){        for(j=w[i];j<=m;j++){            dp[j]=max(dp[j],dp[j-w[i]]+v[i]);        }    }    cout<<dp[m]<<endl;}