uva624 - CD(01背包+打印路径)
来源:互联网 发布:行知中学 编辑:程序博客网 时间:2024/06/06 12:25
题意:
一个数n,及n个数,让你求n个数中取哪些数可更接近n
思路:
01背包,不过要打印路径。
打印路径的话,就看dp[i][j]是否=dp[i-1][j-a[i]]+a[i]],即是不是装了当前背包,装了就j-=a[i],这样从尾向头遍历并标记即可。
代码如下:
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 2000;int dp[N][N],a[N],ans[N];int main() { int n, t; while (~scanf("%d", &t)) { scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); } memset(ans, 0, sizeof(ans)); memset(dp, 0, sizeof(dp)); for (int i = 1; i <= n; i++) { for (int j = 0; j <= t; j++) { dp[i][j] = dp[i - 1][j]; if (j>=a[i]) dp[i][j] =max(dp[i][j], dp[i-1][j - a[i]] + a[i]); } } int temp = t; for (int i = n; i >= 0; i--) { if (dp[i][temp] == dp[i-1][temp - a[i]] + a[i]) { temp = temp - a[i]; ans[i] = 1; } } for (int i = 1; i <= n; i++){ if (ans[i]) printf("%d ", a[i]); } printf("sum:%d\n", dp[n][t]); } return 0;}
0 0
- uva624 - CD(01背包+打印路径)
- uva624 CD 01背包 打印路径
- uva624(01背包+打印路径)
- uva624 CD (01背包+路径的输出)
- uva624 CD 01背包+输出路径
- uva624-CD(背包)
- UVA624(01背包 + 路径打印)
- Uva624 CD (记录路径)
- Uva624(记录路径的01背包)
- uva624 - CD(动规,01背包问题)
- UVA 624 CD(01背包+dp打印路径)
- UVA 624 CD (01背包+打印路径)
- UVA 624CD(打印路径的01背包)
- uva 624 CD (01背包+打印路径)
- UVA 624 - CD (01背包打印路径)
- uva 624 CD 01背包打印路径
- UVA - 624 - CD(动态规划,背包,打印路径)
- Uva 642-CD(0-1背包+打印路径)
- CountDownLatch
- 在Ubuntu 14.04中升级python到2.7.11
- 【POJ】[1703]Find them, Catch them
- 2014蓝桥杯 地宫取宝 &&hdu 4597 四维数组状态记忆化
- Android-在动作栏中添加和删除选项卡
- uva624 - CD(01背包+打印路径)
- warning: target CPU does not support interworking
- 简述list,map,set, queue的区别
- 初学者必知的Python中优雅的用法
- wp模拟器无法运行的DEP6100错误
- python标准库学习4-time
- pycharm 切换github远程分支
- 信息系统安全威胁
- 【杭电】[1276]士兵队列训练问题