首页 > 学院 > 开发设计 > 正文

算法提高 01背包

2019-11-10 21:39:53
字体:
来源:转载
供稿:网友
  算法提高 01背包  时间限制:1.0s   内存限制:256.0MB    问题描述  给定N个物品,每个物品有一个重量W和一个价值V.你有一个能装M重量的背包.问怎么装使得所装价值最大.每个物品只有一个.输入格式  输入的第一行包含两个整数n, m,分别表示物品的个数和背包能装重量。  以后N行每行两个数Wi和Vi,表示物品的重量和价值输出格式  输出1行,包含一个整数,表示最大价值。样例输入3 52 33 54 7样例输出8数据规模和约定  1<=N<=200,M<=5000.

算是再温习一遍二维数组的写法,也有一维的,还是要多注重细节  为啥可以优化就不讲了,手动推一下就能出来

二维:

#include<iostream>#include<cstring>#include<string>#include<cstdio>#include<cmath>using namespace std;const int MAXN=205;const int MAXM=5005;int v[MAXN];int w[MAXN];int dp[MAXN][MAXM];int main(){    int n,m;    scanf("%d %d",&n,&m);    for(int i=1;i<=n;i++)    {        scanf("%d %d",&w[i],&v[i]);    }    for(int i=1;i<=n;i++)    {        for(int j=0;j<=m;j++)        {            if(j>=w[i])                dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);            else                dp[i][j]=dp[i-1][j];        }    }    PRintf("%d/n",dp[n][m]);    return 0;}一维:

#include<iostream>#include<cstring>#include<string>#include<cstdio>#include<cmath>using namespace std;const int MAXN=205;const int MAXM=5005;int v[MAXN];int w[MAXN];int dp[MAXM];int main(){    int n,m;    scanf("%d %d",&n,&m);    for(int i=1;i<=n;i++)    {        scanf("%d %d",&w[i],&v[i]);    }    for(int i=1;i<=n;i++)    {        for(int j=m;j>=w[i];j--)        {            dp[j]=max(dp[j],dp[j-w[i]]+v[i]);        }    }    printf("%d/n",dp[m]);    return 0;}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表