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
总得来说,不管是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; }
相关文章推荐
- 【DP】UVA 624 CD 记录路径
- 【DP】UVA 624 CD 记录路径
- UVA624(dp记录路径问题)
- 【DP】UVA 624 CD 记录路径
- UVA 624 CD(01背包/记录路径)
- UVA 624 CD(01背包,要记录路径)
- UVA 624 记录路径的0-1背包
- 1、UVA624(记录路径问题)
- UVA 624 CD (01背包+打印路径 或 dfs+记录路径)
- UVA - 624 (01背包,记录路径)
- UVA 624(记录路径)
- uva 624 CD(01背包 路径记录)
- Uva 10400 Game Show Math (DP+记录路径)
- Uva624 CD (记录路径)
- 【uva】624 CD【背包记录路径】
- uva 10453 - Make Palindrome(dp, 记录路径)
- uva624 CD(dp 0-1 背包 打印路径)
- UVALive 3907 (LA 3907) Puzzle AC自动机 + 搜索DP 记录路径
- UVA 624(01背包记录路径)
- uva 624 CD(记录路径)