蓝桥杯完全背包java_[蓝桥杯][算法提高VIP]01背包-完全背包 题解(C语言代码)...

# 废话不多说,直接上代码

**0-1背包问题**

原题链接:——>[0-1背包问题](https://www.dotcpp.com/oj/problem1924.html "0-1背包问题")

```c

#include int main()

{

int n,max;//n表示物品个数,max表示背包容量

scanf("%d%d", &n, &max);

int weight[n];//存储物品重量的数组

int value[n];//存储物品价值的数组

int i = 0;

while(i< n){

scanf("%d%d", &weight[i], &value[i]);

i++;

}

int opt[n+1][max+1];//存储每一步选择后的最大价值,即opt[i][w]表示当可选物品为i个,背包容量为w时,所能背的最大价值

for(int i = 0; i<=max; i++){//当n=0,即可选择的物品为0时,无论背包容量再大,此时的最大价值也为0,因为此时没有物品可装

opt[0][i] = 0;

}

for(int i = 0; i<=n; i++){//当max=0,即背包容量为0时,即使有再多可选择的物品,此时的最大价值也为0,因为没有容量的背包装不下任何物品

opt[i][0] = 0;

}

for(int i= 1; i<=n; i++){

for(int w = 1; w<=max; w++){

if(w-weight[i-1] < 0){//当背包容量没有当前物品大时,此时只有一种选择,就是不选

opt[i][w] = opt[i-1][w];

}else{//当背包容量足够容纳当前物品时,此时有两种选择:即装下这个物品和不装这个物品,我们应该取这两种选择所能创造的价值最大的那个

int a = opt[i-1][w-weight[i-1]] + value[i-1];//装下该物品创造的价值

int b = opt[i-1][w];//不装该物品创造的价值

if(a>b){//当装下该物品创造的价值更大时,就选择装下

opt[i][w] = a;

}else{//当不装该物品创造的价值更大时,就选择不装

opt[i][w] = b;

}

}

}

}

printf("%d", opt[n][max]);

return 0;

}

```

**完全背包问题**

原题链接:——>[完全背包问题](https://www.dotcpp.com/oj/problem2132.html "完全背包问题")

0-1背包问题与完全背包问题的区别就是:0-1背包不能重复选择,而完全背包可以重复选择

解题思路与0-1背包完全一样,只需将上述代码做一处小小的改动,即可应用于完全背包问题

即将第30行代码

int a = opt[i-1][w-weight[i-1]] + value[i-1];//装下该物品创造的价值

改成下面即可:

int a = opt[i][w-weight[i-1]] + value[i-1];//装下该物品创造的价值

有问题请留言!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值