您的位置:首页 > 其它

HDU2602 Bone Collector

2012-08-10 12:20 190 查看
题意大致是:

有个人在爱好是收集骨头,然后背包容量有限,每块骨头有特定的重量和价值。求在有限制的背包容量下装下的骨头的最大价值。

注意,输入是先价值,后重量,别搞混了。

解题思路是:

设定一个Dp数组,初始全为0,用来存放”现阶段“最大的价值。

#include<iostream>
using namespace std;
#define MAXN 1100

int DpValue[MAXN];
int value[MAXN];
int volume[MAXN];
int main() {
int n;
while (cin>>n) {
for (int o=0; o<n; o++) {
int bagValume;
int bone;
cin>>bone>>bagValume;
//此处Dp数组的初始化必须练DpValue[0]一并初始化,因为顾忌到包容量为0的情况;
memset(DpValue, 0, sizeof(DpValue));
for (int i=1; i<=bone; i++ ) {
cin>>value[i];
}
for (int i=1; i<=bone; i++ ) {
cin>>volume[i];
}

for (int i=1; i<=bone; i++ ) {
for (int j=bagValume; j>=volume[i]; j--) {
//更新Dp数组,找到容量为j的时候现阶段最大容量。
//DpValue[j - volume[i]] + value[i] 表示此时加上第I个骨头后,价值是多少,用来与现阶段容量j的价值做比较;
DpValue[j] = DpValue[j] > (DpValue[j - volume[i]] + value[i]) ? DpValue[j] : DpValue[j - volume[i]] + value[i];
}
}
cout<<DpValue[bagValume]<<endl;
}
}
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: