您的位置:首页 > 其它

01背包基础-1085 背包问题

2016-09-06 16:22 288 查看
做了好久背包题了,再重新思考一遍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
[V]<<endl;
return 0;
}


外层种类 内层体积,从0到Vmax 注意:有可能当前遍历的体积小于物品体积,则继承之前的数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: