HDU 2602 Bone Collector(01背包问题)
来源:互联网 发布:java if else语句 编辑:程序博客网 时间:2024/06/05 15:37
如果直接搜索,会浪费大量时间搜索已知的结果,造成超时。
可以用记忆化数组记录已经搜索过的结果,在查询已知的结果时,直接返回即可
如果你不知道为什么错了,那么...........
请注意是先输入价值,后输入容量
利用dp可以更好的处理,提升效率
void solve(int i, int j) {for (int i = 0; i <= N; i++) {for (int j = 0; j <= V; j++) {if (j < weight[i]) {dp[i+1][j] = dp[i][j];} else {dp[i+1][j] = max(dp[i][j], dp[i][j-weight[i]]+value[i]);}}}printf("%d\n", dp[N][V]);}
搜索如下
#include<stdio.h>#include<string.h>int N, V;int weight[1005], value[1005];int dp[1005][1005];int max(int a, int b) {return a>b?a:b;}int solve(int i, int j) {if (dp[i][j] >= 0) {return dp[i][j];}int sum;if (i == N) {sum = 0;} else if (j < weight[i]) {sum = solve(i+1, j);} else {sum = max(solve(i+1, j), solve(i+1, j - weight[i]) + value[i]);}return dp[i][j] = sum;}int main(void){int n;scanf("%d", &n);while (n--) {scanf("%d %d", &N, &V); for (int i = 0; i < N; i++) {scanf("%d", &value[i]); } for (int i = 0; i < N; i++) {scanf("%d", &weight[i]); }memset(dp, -1, sizeof(dp));printf("%d\n", solve(0, V));}return 0;}
阅读全文
0 0
- HDU 2602Bone Collector (01背包问题)
- hdu 2602 Bone Collector 01背包问题
- HDU-Bone Collector(01背包问题)
- hdu 2602 Bone Collector (01 背包问题)
- hdu 2602 Bone Collector(01背包问题)
- HDU 2602 Bone Collector(01背包问题)
- HDU 2602 Bone Collector(01背包问题)
- hdu 2602 Bone Collector (01背包)
- hdu 2602 Bone Collector(01背包)
- HDU 2602 Bone Collector( 01背包 )
- HDU 2602 Bone Collector(01背包)
- HDU 2602 Bone Collector(01背包)
- HDU 2602 Bone Collector (01背包)
- HDU 2602 Bone Collector(01背包)
- HDU 2602 Bone Collector(01背包)
- hdu 2602 Bone Collector (01背包)
- hdu 2602 Bone Collector(01背包)
- HDU 2602 Bone Collector(01背包)
- 存储在变量 sys.argv 中
- Linux设备驱动之中断---基本代码框架
- 万树IT:如何提升Android水平
- 关于如何在程序中使用命令行参数
- 判断单链表是否递增
- HDU 2602 Bone Collector(01背包问题)
- BPNN
- sys.argv 列表中的第一项总是一个字符串
- canvas setShadowLayer()画阴影不起作用
- Java IO的个人学习笔记(3)
- coursera-斯坦福-机器学习-吴恩达-第9周笔记(下)-推荐系统
- CSS选择器与层叠
- 编写函数: unsigned int reverse_bit(unsigned int value); 这个函数的返回 值value的二进制位模式从左到右翻转后的值。
- 必须的,所以如果用户忘