1267:【例9.11】01背包问题

                                                                                                                              

1267:【例9.11】01背包问题
时间限制: 1000 ms         内存限制: 65536 KB
提交数: 28735     通过数: 17213
【题目描述】

一个旅行者有一个最多能装 M 公斤的背包,现在有 n 件物品,它们的重量分别是W1W2...,Wn,它们的价值分别为C1,C2,...,Cn,求旅行者能获得最大总价值。

【输入】

第一行:两个整数,M(背包容量,M<=200)和N(物品数量,N<=30)

2..N+12..N+1行:每行二个整数WiCi,表示每个物品的重量和价值。

【输出】

仅一行,一个数,表示最大总价值。

【输入样例】
10 4
2 1
3 3
4 5
7 9
【输出样例】
12

······(此处省略999+字)
看了上面的内容,大家一定知道了什么是01背包了吧。
好,我们分析一下题目:
设f[i][v]表示前i件物品,总重量不超过v的最优值
所以:

 


 则f[n][m]为最优解。

下面是代码环节:

#include<cstdio>
using namespace std;

const int maxm=201,maxn=31;
int m,n;
int w[maxn],c[maxn];
int f[maxn][maxm];
int max(int x,int y)


int max(int x,int y){
 
}
int main(){

}

这是主框架↑

顾名思义,有max函数,里面的代码,我就不多说了。

int max(int x,int y){
    if(x<y) return y;
    else return x;
}

main里的代码

int main(){

    scanf("%d%d",&m,&n);
    for(int i=1;i<=n;i++)  scanf("%d%d",&w[i],&c[i]);

//上面的是输入
    for(int i=1;i<=n;i++){
        for(int v=m;v>0;v--){
            if(w[i]<=v) f[i][v]=max(f[i-1][v],f[i-1][v-w[i]]+c[i]);
            else f[i][v]=f[i-1][v];
        }
    }

//

 

 

 //f[i][v]表示前i件物品,总重量不超过v的最优值,套公式就可以

    printf("%d",f[n][m]);

// f[n][m]为最优解。
    return 0;

}

连起来的代码(图片):

 

 

 当然这不是最好的方法。

更好的方法,代码当然少,不用写函数:

 

 

 这个方法优化了空间复杂度,保对。

 

 

 

 

 

 

 

 

第一种方法↑

 


 

 

 

 

第二种方法↑


posted @ 2022-05-11 21:39  傲来国国王  阅读(276)  评论(0编辑  收藏  举报