目录
终于终于看懂了01背包问题,总耗n小时,现在来总结一下吧!
01背包问题
已知条件
①有N个物品,有一个背包。背包的容量是V。
②对于每个物品:体积,价值
③每个物品只能使用一一次
需要满足两个条件
①选择的这i个物品总体积不超过V
②这些物品的价值加起来最大
③对于某一个物品:使用/不使用
确定状态转移方程
dp[illjl的含义:
从下标为[1-i]的物品里任意取,放进容量为i的背包,价值总和最大是多少。
(首先,当背包里没有第i件物品的时候,此时背包里面物品的最大价值就是第i件物品之前的物品的价值总和。
记作dp[i][j]=dp[i-1][j];)
(当可以放进第i件物品的时候,此时最大价值应该是背包容量减去物品i的容量之后的剩余容量能放的物品价值加上物品的价值。
记作dp[i-1][j-weight[i]]+value[i];这时最优解在dp[i]li]取到)
写的超级详细了吧!!看代码吧!
#include<stdio.h>
int dp[1000][1000];
int n,V;
int v[1000],w[1000];//体积,价值
int main()
{
scanf("%d%d",&n,&V);
for(int i=1;i<=n;i++)
scanf("%d%d",&v[i],&w[i]);
for(int i=1;i<=n;i++)
{
for(int j=0;j<=V;j++)
{
if(dp[i][j]>=dp[i-1][j])
dp[i][j]=dp[i][j];
else
dp[i][j]=dp[i-1][j];
if(j>=v[i])
{
if(dp[i][j]>=dp[i-1][j-v[i]]+w[i])
dp[i][j]=dp[i][j];
else
dp[i][j]=dp[i-1][j-v[i]]+w[i];
}
}
printf("%d",dp[n][V]);
return 0;
}
}
刷了一道相关题目,还存在一些bug,明天再改吧!!