背包问题专项练习
文章目录
写在前面
背包问题1——01背包
题目大意
有N种物品和一个容量为V的背包。第i种物品只有1个,体积是v[i],价值是w[i]。选择物品装入背包使这些物品的体积总和不超过背包容量,且价值总和最大,求出这个最大价值。
解题思路
双重DP(过于简单不讲自己看代码)
代码
#include<bits/stdc++.h>
using namespace std;
int t,n,f[1010],w[1010],v[1010];
int mx(int x,int y)
{
if(x>y)return x;
else return y;
}
int main()
{
scanf("%d%d",&t,&n);
for(int i=1;i<=n;i++)scanf("%d%d",&v[i],&w[i]);
for(int i=1;i<=n;i++)
for(int j=t;j>=v[i];j--)
f[j]=mx(f[j],f[j-v[i]]+w[i]);
printf("%d",f[t]);
return 0;
}
背包问题3——完全背包
题目大意
有N种物品和一个容量为V的背包。第i种物品有无穷个,体积是v[i],价值是w[i]。选择物品装入背包使这些物品的体积总和不超过背包容量,且价值总和最大,求出这个最大价值。
解题思路
加强的01背包(过于简单不讲自己看代码)
代码
#include<iostream>
using namespace std;
int wi[10005],vi[10005],fi[10005];
int main()
{
int n,t;
cin>>n>>t;
for(int i=1;i<=t;i++)
cin>>wi[i]>>vi[i];
for(int i=1;i<=t;i++)
for(int j=wi[i];j<=n;j++)
fi[j]=max(fi[j-wi[i]]+vi[i],fi[j]);
cout<<fi[n];
return 0;
}
背包问题2——多重背包
题目大意
有N种物品和一个容量为V的背包。第i种物品最多有m[i]件可用,体积是v[i],价值是w[i]。选择物品装入背包可使这些物品的体积总和不超过背包容量,且价值总和最大。
解题思路
加强的01背包(过于简单不讲自己看代码)
代码
#include<cstdio>
using namespace std;
int n,t,w[5106],v[5106],f[5006][5005],s[5005];
int max(int x,int y){
if(x>y) return x;
return y;
}int min(int x