完全背包问题

Posted macren

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了完全背包问题相关的知识,希望对你有一定的参考价值。

【题目描述】

设有nn种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为MM,今从nn种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于MM,而价值的和为最大。

【输入】

第一行:两个整数,MM(背包容量,M200M≤200)和NN(物品数量,N30N≤30);

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

【输出】

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

【输入样例】

10 4
2 1
3 3
4 5
7 9

【输出样例】

max=12

递推实现:

#include <bits/stdc++.h>
using namespace std;
const int maxm=201,maxn = 31;
int m,n;
int w[maxn],c[maxn];
int f[maxn][maxm];
int main()

cin>>m>>n;
for(int i=1;i<=n;i++)
cin>>w[i]>>c[i];
for(int i=1;i<=n;i++)
for(int v=1;v<=m;v++)
if(v<w[i]) f[i][v]=f[i-1][v];
else
if(f[i-1][v]>f[i][v-w[i]]+c[i]) f[i][v]=f[i-1][v];
else f[i][v]=f[i][v-w[i]]+c[i];
cout<<"max="<<f[n][m]<<endl;
return 0;

递归实现

#include <bits/stdc++.h>
using namespace std;
const int maxn = 31;
#define INF (1<<30)
int vis[maxn], d[maxn];
int v[maxn], w[maxn];
int n;

int dp(int i)

int & ans = d[i];
if (ans != -1)
return ans;
ans = -INF;
for (int j = 1; j <=n; j++)

if (i >= v[j])

ans = max(ans, dp(i - v[j]) + w[j]);



return ans;

int main()

int c=0;
cin >>c>> n;

for (int i = 1; i <=n; i++)
cin >> v[i] >> w[i];
memset(vis,0,sizeof(vis));
memset(d, -1, sizeof(d));
d[0] = 0;
cout<<"max="<<dp(c)<<endl;
return 0;

递归实现是有错误的,能得80%的正确率。思考为什么??

边界问题是一定的,极限情况:每一种情况输入的内容为0要排除掉

第二种情况,如果输入

1 2

4 5

6 7

所有的情况不能装得下,怎么办?上面的递归没有对if中的else情况进行判断

第三个问题是数组开得太小。

改进如下:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 201;
#define INF (1<<30)
int vis[maxn], d[maxn];
int v[maxn], w[maxn];
int n,flag;

int dp(int i)

int & ans = d[i];
if (ans != -1)
return ans;
ans = -INF;
for (int j = 0; j <n; j++)

if (i >= v[j])

ans = max(ans, dp(i - v[j]) + w[j]);
flag=1;



if(flag==0) ans=0;
return ans;

int main()

int c=0;
cin >>c>> n;
if(c==0||n==0)
cout<<"max=0"<<endl;
return 0;

for (int i = 0; i <n; i++)
cin >> v[i] >> w[i];
memset(vis,0,sizeof(vis));
memset(d, -1, sizeof(d));
d[0] = 0;
cout<<"max="<<dp(c)<<endl;
return 0;

以上是关于完全背包问题的主要内容,如果未能解决你的问题,请参考以下文章

背包问题:0-1背包完全背包和多重背包

01背包和完全背包问题

01背包完全背包多重背包分组背包总结

动态规划——背包问题python实现(01背包完全背包多重背包)

动态规划之背包问题-01背包+完全背包+多重背包

背包问题(01背包,完全背包,多重背包)