动态规划 背包问题

来源:互联网 发布:淘宝里的视频怎么转发 编辑:程序博客网 时间:2024/06/08 17:27

01背包问题

有n个重量和价值分别为wi和vi的物品,从这些物品中挑出总重量不超过W的物品,求所挑选方案中价值的最大值。

(1=<n<=100,1<=wi,vi<=100,1<=W<=10000)

dp[i+1][j]:从0到i+1个物品中选出总重量不超过j的物品同时总价值最大(dp[0][j]=0)

void solve(){    for(int i=0;i<n;i++){        for(int j=0;j<=W;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]);//要和不要求最大值        }    }    printf("%d\n",dp[n][W]);}
01背包问题2

(1=<n<=100,1<=wi<=10000000,1<=vi<=100,1<=W<=1000000000)

当限制条件改变时(变大)

dp[i+1][j]:从0到i+1个物品中选出总价值为j时最小的重量(dp[0][0]=0,dp[0][j]=INF前0个物品中什么都挑选不了,所以初始值为INF)

int dp[MAX_N+1][MAX_N*MAX_V+1]void solve(){    fill(dp[0],dp[0]+MAX_N*MAX_V+1,INF);    dp[0][0]=0;    for(int i=0;i<n;i++){        for(int j=0;j<=MAX_N*MAX_V;j++){            if(j<v[i])dp[i+1][j]=dp[i][j];            else dp[i+1][j]=min(dp[i][j],dp[i][j-v[i]+w[i]);        }    }    int res=0;    for(int i=0;i<=MAX_N*MAX_V,i++){        if(dp[n][i]<=W)res=i;//n个物品都选了res为价值最大且不超过W的价值    }    printf("%d\n",res);}

完全背包问题

有n个重量和价值分别为wi和vi的物品,从这些物品中挑出总重量不超过W的物品,每种物品任意选多件,求所挑选方案中价值的最大值。

void solve(){    for(int i=0;i<n;i++){        for(int j=0;j<=W;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]);        }    }    printf("%d\n",dp[n][W]);}



原创粉丝点击