hdu 2602 Bone Collector

本文对比了两种解决01背包问题的代码实现。一种是正确的迭代方法,通过动态规划计算最大价值;另一种则存在缺陷,主要在于状态转移方程及遍历顺序不当导致错误结果。

典型的01背包问题,第一个代码是正确的,第二代码错了,一直不明白错在哪儿了?求高手指点!

/* THE PROGRAM IS MADE BY PYY */ /*----------------------------------------------------------------------------// Copyright (c) 2011 panyanyany All rights reserved. URL : http://acm.hdu.edu.cn/showproblem.php?pid=2602 Name : Bone Collector Date : Friday,May 6,2011 Time Stage : 1 hours around Result: 00665146 2011-05-06 01:44:42 Accepted 1001 31 MS 288 KB Visual C++ pyy Test Data: Review: //----------------------------------------------------------------------------*/ #include <iostream> #include <string.h> using namespace std; const int size = 1010; int tcase, bone, bag; int value[size], weight[size], dp[size]; int knapsack() { int i, j, k; memset( dp, 0, sizeof(dp) ); for( i = 1; i <= bone; ++i ) { for( j = bag; j >= weight[i]; --j ) dp[j] = max( dp[j], dp[j-weight[i]] + value[i] ); } return dp[bag]; } int main() { int i, j, k; while( cin >> tcase ) { while( tcase-- ) { cin >> bone >> bag; for( i = 1; i <= bone; ++i ) cin >> value[i]; for( i = 1; i <= bone; ++i ) cin >> weight[i]; cout << knapsack() << endl; } } return 0; }

错误代码

006651402011-05-06 01:20:21Wrong Answer100146 MS4276 KBVisual C++pyy

#include <iostream> #include <string.h> using namespace std; const int size = 1010; int tcase, bone, bag; int value[size], weight[size], dp[size][size]; void knapsack() { int i, j, k; memset( dp, 0, sizeof(dp) ); for( i = 1; i <= bone; ++i ) { for( j = weight[i]; j <= bag; ++j ) dp[i][j] = max( dp[i-1][j], dp[i-1][j-weight[i]] + value[i] ); } } int main() { int i, j, k; while( cin >> tcase ) { while( tcase-- ) { cin >> bone >> bag; for( i = 1; i <= bone; ++i ) cin >> value[i]; for( i = 1; i <= bone; ++i ) cin >> weight[i]; knapsack(); cout << dp[bone][bag] << endl; } } return 0; }

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值