uva624 - CD(01背包+打印路径)
2016-03-18 23:22
417 查看
题意:
一个数n,及n个数,让你求n个数中取哪些数可更接近n
思路:
01背包,不过要打印路径。
打印路径的话,就看dp[i][j]是否=dp[i-1][j-a[i]]+a[i]],即是不是装了当前背包,装了就j-=a[i],这样从尾向头遍历并标记即可。
代码如下:
一个数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 ,a ,ans ; 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 [t]); } return 0; }
相关文章推荐
- HDU-1160 FatMouse's Speed
- 高精度减法
- Android-在动作栏中添加和删除选项卡
- warning: target CPU does not support interworking
- 【POJ】[1703]Find them, Catch them
- Word文档分割总结
- C语言中的关键字
- CountDownLatch
- 在Ubuntu 14.04中升级python到2.7.11
- 2014蓝桥杯 地宫取宝 &&hdu 4597 四维数组状态记忆化
- Android中四大组件总结
- Java中String类(字符串操作)的10个常见问题和解决方法
- 多线程中跨线程访问的解决方法
- 在中国,程序员的职业生涯有多长?
- Java命名规范
- composer 安装 laravel 日志
- 老罗Looper(23)例子讲述Looper与Message,线程和Handler关系
- 删除链表中重复的结点
- 从n到m,有-1和*2两种操作。问最少走几步
- mac jdk原因导致 maven命令无法执行