题解 | #【模板】01背包#
【模板】01背包
http://www.nowcoder.com/practice/fd55637d3f24484e96dad9e992d3f62e
描述
有一个体积为的背包,个物体,每个物体的体积和价值分别为和,每个物品仅可用一次,问:
- 背包能装的最大价值是多少?
- 将背包装满后的最大价值是多少?
思路
- 01背包的模板题,第一问答案为,第二问答案为
- 设表示使用了个物体体积为时的最大价值,01背包的转移方程为
- 通过从后向前遍历的方法可以省略一维存储,具体实现见代码
代码
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e3+5;
int dp[MAXN],v[MAXN],w[MAXN];
int main()
{
int n,V;
scanf("%d%d",&n,&V);
for(int i=1;i<=n;i++)
scanf("%d%d",&v[i],&w[i]);
memset(dp,-1,sizeof(dp));
dp[0]=0;
for(int i=1;i<=n;i++)
for(int j=V-v[i];j>=0;j--)
if(dp[j]>=0)
dp[j+v[i]]=max(dp[j+v[i]],dp[j]+w[i]);
int mx=0;
for(int i=0;i<=V;i++)
mx=max(mx,dp[i]);
if(dp[V]==-1) dp[V]=0;
printf("%d\n%d\n",mx,dp[V]);
}
时间复杂度,空间复杂度