UVA624(01背包 + 路径打印)
2014-10-23 16:42
267 查看
题目的意思就就是给你一个值,在给你几个数字.用这些数字凑出最接近这个值的组合.简单01背包 + 路径打印.
路径打印时可以根据 f[i][j] == f [ i - 1] [ j ] 的话,这个数就没有被选择.
从后往前找:
AC代码;
路径打印时可以根据 f[i][j] == f [ i - 1] [ j ] 的话,这个数就没有被选择.
从后往前找:
AC代码;
#include<stdio.h> #include<string.h> const int N = 1000; const int M = 25; int track[M]; int f[M][N * M]; int vis[M]; int n; int sum; int dp() { for (int i = 1 ; i <= n ; i++) { for (int j = 0 ; j <= sum ;j++) { f[i][j] = f[i - 1][j]; if (j >= track[i]) { int temp =f[i - 1][j - track[i]] + track[i]; f[i][j] = f[i][j] > temp ? f[i][j] : temp; } } } } void print() { int j = sum; for (int i = n ; i >= 1 ;i--) { if (f[i][j] != f[i - 1][j]) { printf("%d " ,track[i]); j -= track[i]; } } } int main () { while(~scanf("%d%d",&sum,&n)) { for (int i = 1 ; i <= n ;i++) { scanf("%d", &track[i]); } memset(f , -1 ,sizeof(f)); memset(vis , 0 ,sizeof(vis)); for (int i = 0 ; i < N * M;i++) { f[0][i] = 0; } dp(); print(); printf("sum:%d\n" ,f [sum]); } }
相关文章推荐
- uva 624 CD 01背包打印路径
- uva 624 CD 01背包打印路径
- UVA 624 - CD (01背包打印路径)
- uva 624 (01背包打印路径)
- uva 624 CD (0-1背包打印路径)
- uva 624 CD(01背包 路径记录)
- UVA 624 - CD (01背包 + 打印物品)
- UVA - 624 - CD(动态规划,背包,打印路径)
- UVA 624 CD(01背包,要记录路径)
- UVA 624(01背包记录路径)
- uva 624 CD 01背包状态压缩记路径
- UVA 624 (0 1背包 + 打印路径)
- uva624 CD(dp 0-1 背包 打印路径)
- UVa 624 CD (01背包路径输出)
- UVA 题目624 CD(01背包输出路径啊)
- 01背包问题【简单背包,UVA624】
- UVa 624 CD(01背包 需要记录最优解的任一方案)
- Uva 642-CD(0-1背包+打印路径)
- UVA62401背包,滚动数组,并打印路径
- UVA 624 CD(01背包+输出方案)