0-1背包问题(二维数组来实现)

在0-1背包问题中,每个物品只能拿一次,如何才能让这个有限的背包放着价值最高的东西,思路如下:

有两种解决方法,分别是一维数组和二维数组,二维数组中前面那个数字代表的是第几个物品,后面的那个代表的是背包的体积,那么如何才能拿走最有价值且最多的东西呢?

二维数组:首先就是要初始化这个二维数组,让这个二维数组成为全局变量后,就会自动初始化为0,这时候如果这个物品比当前状态的背包体积大的话,那么这个二维数组a[i][j]的值就等于a[i-1][j],如果这个物品比当前状态要小的话,那么就可以放到里面进去,那么这时候就还有两种情况,分别就是尽管这个物品很小,但是我就是不放进去,那么就依旧是等于a[i-1][j],如果想要放进去的话,那么就是等于value[i]+a[i-1][j-v[i]]

例子和代码如下:

#include <bits/stdc++.h> ​

using namespace std; ​

int f[100][100];//状态函数fi表示第i件物品容量为j最大价值 ​

int v[100]; ​ int w[100]; //v和w这两个数组分别代表物品体积和物品重量(价值)​

/* ​ 函数功能:求完全背包 ​ 函数形参:物品数量和背包容量 ​ 函数返回值:返回最大值 ​ */ ​

int fun(int n,int m) ​ { ​

for(int i=1;i<=n;i++) //物品 ​ { ​

for(int j=1;j<=m;j++) //容量 ​ { ​

if(j<w[i]) //装不下 ​

f[i][j]=f[i-1][j]; //就等于i-1件物品容量等于j时候的价值 ​

else ​

f[i][j]=max(f[i-1][j],f[i-1][j-w[i]+v[i]);//装得下分为两种情况1.不装 2.装 ​ } ​ } ​

return f[n][m]; ​ } ​

int main() ​ { ​

int n,m; ​

cin>>n>>m; ​

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

cin>>w[i]>>v[i]; ​

cout<<fun(n,m); ​

return 0; ​ }

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值