在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; }