您的位置:首页 > 其它

UVA-624 记录路径dp

2017-08-11 11:06 393 查看
https://vjudge.net/problem/UVA-624

总得来说,不管是01背包还是完全背包,其动态转移每次只有两种状态在转移,就说这道题目,

dp[i][j]=max(dp[i-1][j],dp[i-1][j-v[i]]+val[i])    对于dp[i][j]来说,它只能使由两个状态中的一个转移过来的,要么取一件,要么不取,那么我们再开一个二维数组s[i][j],0表示不取,1表示取,那么不取是dp[i-1][j],取是dp[i-1][j-v[i]]+val[i];这样,数组s[i][j]就记录下了每次动态转移的方向,在递归调用,打印路径,结果就出来了,具体可以看http://www.cnblogs.com/ziyi--caolu/archive/2013/04/10/3012578.html

裁谈会

UVA-624

#include<iostream>
#include<string.h>
#include<iomanip>
using namespace std;
#include<algorithm>
int dp[10005],w[10005],f[10005];
bool a[25][10005];
int c;
int n,m;
int main()
{
while(cin>>m>>n)
{
memset(a,false,sizeof(a));
memset(dp,0,sizeof(dp));

for(int i=1;i<=n;i++)
cin>>w[i];

for(int i=1;i<=n;i++)
for(int j=m;j>=w[i];j--)
{
dp[j]=max(dp[j],dp[j-w[i]]+w[i]);
if(dp[j]==dp[j-w[i]]+w[i])
a[i][j]=true;
}
int c=0;
for(int i=n,j=dp[m];j>0&&i>0;i--)
{
if(a[i][j])
{
f[c++]=w[i];
j-=w[i];
}
}
for(int i=c-1;i>=0;i--)
cout<<f[i]<<" ";
cout<<"sum:"<<dp[m]<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  背包