您的位置:首页 > 其它

0/1 背包 dp问题

2016-01-26 22:21 302 查看
//20160126
//0/1背包
//W 能装下的重量
//w 该物品的重量
//v 该物品的价值

#include<iostream>
#include<algorithm>
using namespace std;

#define MAX_N 101
int n;
pair<int,int> object[MAX_N];//first=w,second=v
int W;

int dp[MAX_N][MAX_N];

int rec(int i,int j)
{
if(dp[i][j]>0)
return dp[i][j];
else{
int res;
if(i==n)
res=0;
else
if(j<object[i].first)
{
res=rec(i+1,j);
}
else
{
res=max(rec(i+1,j),rec(i+1,j-object[i].first)+object[i].second);
}
return dp[i][j]=res;
}
}

void solve()
{
cout<<rec(0,W)<<endl;
}

int main()
{
while(cin>>n)
{
for(int i=0;i<n;i++)
{
cin>>object[i].first;
cin>>object[i].second;
}
cin>>W;
solve();
}
}


由此可得一个dp公式

dp
[j]=0

dp[i][j]= dp[i+1][j] j<w[i]

max(dp[i+1][j],dp[i+1][j-w[i]+v[i]);

//20150127
//dp
#include<iostream>
#include<algorithm>
using namespace std;

#define MAX_N 101
#define MAX_W 10001
pair<int,int> p[MAX_N];//first=w,second=v
int n;
int W;
int dp[MAX_N][MAX_W];

int solve()
{
for(int i=n-1;i>=0;i--)
{
for(int j=0;j<=W;j++)
{
if(j<p[i].first)
dp[i][j]=dp[i+1][j];
else
dp[i][j]=max(dp[i+1][j],dp[i+1][j-p[i].first]+p[i].second);
}
}
return dp[0][W];
}

int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>p[i].first>>p[i].second;
}
cin>>W;
cout<<solve()<<endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: