01背包问题

来源:互联网 发布:安卓php环境搭建 编辑:程序博客网 时间:2024/05/17 08:46
#include<iostream>#include<cstring>#include<algorithm>#define MAX 100using namespace std;int n,w;int value[MAX]={3,2,4,2};int weight[MAX]={2,1,3,2};int dp[MAX][MAX];//朴素方法int ans2(int i,int j){    int res;    if(i==n)        res=0;    else if(weight[i]>j)        res=ans2(i+1,j);    else        res=max(ans2(i+1,j),ans2(i+1,j-weight[i])+value[i]);    return res;}//记忆化搜索int ans(int i,int j)//从i开始最多重量为j能选择的最大价值{    int res;    if(dp[i][j]>=0)        return dp[i][j];    else if(weight[i]>j)        res=ans(i+1,j);    else        res=max(ans(i+1,j),ans(i+1,j-weight[i])+value[i]);    return dp[i][j]=res;}//DP记忆化搜索void solve1(){    memset(dp,-1,sizeof(dp));    cout<<ans(0,w)<<endl;}//DP反向递推void solve2()// dp[i][j]表示从i开始选择重量j以内的最大价值{   memset(dp,0,sizeof(dp));   for(int i=n-1;i>=0;i--)   {        for(int j=0;j<=w;j++)        {            if(weight[i]>j)                dp[i][j]=dp[i+1][j];            else                dp[i][j]=max(dp[i+1][j],dp[i+1][j-weight[i]]+value[i]);        }   }   cout<<dp[0][w]<<endl;}//DP正向递推void solve3()//dp[i][j]表示前i个物品中选择不超过重量j的最大价值{       memset(dp,0,sizeof(dp));    for(int i=0;i<n;i++)    {        for(int j=0;j<=w;j++)        {            if(weight[i]>j)                dp[i+1][j]=dp[i][j];            else                dp[i+1][j]=max(dp[i][j],dp[i][j-weight[i]]+value[i]);        }    }    cout<<dp[n][w]<<endl;}//DP状态转移void solve4(){    memset(dp,0,sizeof(dp));    for(int i=0;i<n;i++){        for(int j=0;j<=w;j++){             dp[i+1][j]=max(dp[i+1][j],dp[i][j]);             if(j+weight[i]<=w)                dp[i+1][j+weight[i]]=max(dp[i+1][j+weight[i]],dp[i][j]+value[i]);        }    }    cout<<dp[n][w]<<endl;}int main(){    while(cin>>n>>w)        solve4();}

0 0
原创粉丝点击