做了好久背包题了,再重新思考一遍01背包发现自己有好多理解错误。
拿这题重新弥补下:
1. 空间优化
#include <iostream>
#include <stdio.h>
using namespace std;
int dp[10005];
int w[10005];
int v[10005];
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
scanf("%d%d",&w[i],&v[i]);
for(int i=n;i>=0;i--)
for(int j=m;j>=w[i];j--)
dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
cout<<dp[m]<<endl;
return 0;
}
外层种类 内层体积,注意:从最大到V【i】,因为如果从V【i】到最大那么会出现一个物品拿两次的情况2.不优化的情况也一定要明白。后面的基础
#include <iostream>
#include <stdio.h>
using namespace std;
int dp[101][10010];
int w[101];
int v[101];
int main()
{
int n,V;
cin>>n>>V;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&w[i],&v[i]);
}
for(int i=1;i<=n;i++)
{
for(int j=0;j<=V;j++)
{
if(j>=w[i])
dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);
else
dp[i][j]=dp[i-1][j];
}
}
cout<<dp[n][V]<<endl;
return 0;
}
外层种类 内层体积,从0到Vmax 注意:有可能当前遍历的体积小于物品体积,则继承之前的数