【DP】UVA 624 CD 记录路径
2017-08-02 08:52
429 查看
开一个数组p
若dp[i-1][j]<dp[i-1][j-a[i]]+a[i]时就记录下p[j]=a[i];表示此时放进一个轨道
递归输出p
若dp[i-1][j]<dp[i-1][j-a[i]]+a[i]时就记录下p[j]=a[i];表示此时放进一个轨道
递归输出p
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <limits.h> #include <malloc.h> #include <ctype.h> #include <math.h> #include <string> #include<iostream> #include <algorithm> using namespace std; #define MAXN 11111 #include <queue> #include <vector> #define IN freopen("in.txt","r",stdin); int a[30],dp[30][MAXN],p[MAXN]; void out(int x) { if(x==0) return ; else out(x-p[x]); printf("%d ",p[x]); } int main() { int n,m; // IN; while(scanf("%d%d",&m,&n)!=EOF) { memset(dp,0,sizeof(dp)); memset(p,0,sizeof(p)); scanf("%d",&n); for(int i=1; i<=n; i++) scanf("%d",&a[i]); for(int i=1; i<=n; i++) { for(int j=m; j>0; j--) { if(j>=a[i]&&dp[i-1][j]<dp[i-1][j-a[i]]+a[i]) dp[i][j]=dp[i-1][j-a[i]]+a[i],p[j]=a[i]; else dp[i][j]=dp[i-1][j]; } } int i; for(i=m;i>=0;i--) if(dp [i]>dp [i-1]) break; out(i); printf("sum:%d\n",dp [m]); } return 0; }
相关文章推荐
- 【DP】UVA 624 CD 记录路径
- 【DP】UVA 624 CD 记录路径
- UVA 624 CD (01背包+打印路径 或 dfs+记录路径)
- uva 624 CD(01背包 路径记录)
- UVA 624 CD(01背包+dp打印路径)
- Uva624 CD (记录路径)
- uva 624 CD(记录路径)
- UVA624(dp记录路径问题)
- UVA-624 记录路径dp
- 【uva】624 CD【背包记录路径】
- uva624 CD(dp 0-1 背包 打印路径)
- UVA 624 CD(01背包,要记录路径)
- UVA 624 CD(01背包+记录路径)
- CD - UVa 624 01背包记录路径
- UVA 624 CD(01背包/记录路径)
- UVa - 624 - CD(0-1 + 记录路径)
- UVA 624(01背包记录路径)
- Uva 10400 Game Show Math (DP+记录路径)
- UVA 624 CD(打印路径的01背包)
- uva 624 CD 01背包状态压缩记路径