HDU 2602 Bone Collector (01背包)
发布日期:2021-07-27 19:48:22 浏览次数:3 分类:技术文章

本文共 1897 字,大约阅读时间需要 6 分钟。

Many years ago , in Teddy’s hometown there was a man who was called “Bone Collector”. This man like to collect varies of bones , such as dog’s , cow’s , also he went to the grave …

The bone collector had a big bag with a volume of V ,and along his trip of collecting there are a lot of bones , obviously , different bone has different value and different volume, now given the each bone’s value along his trip , can you calculate out the maximum of the total value the bone collector can get ?

Input

The first line contain a integer T , the number of cases.
Followed by T cases , each case three lines , the first line contain two integer N , V, (N <= 1000 , V <= 1000 )representing the number of bones and the volume of his bag. And the second line contain N integers representing the value of each bone. The third line contain N integers representing the volume of each bone.
Output
One integer per line representing the maximum of the total value (this number will be less than 2 31).
Sample Input
1
5 10
1 2 3 4 5
5 4 3 2 1
Sample Output
14

大致思路:

标准的01背包,创建一个二维数组dp[i][j],i代表第i件物品,j代表剩余的背包容量。

但不知道为什么用滚动数组做就是WA。先记录一下。

代码:

#include
#include
#include
#include
using namespace std;int dp[1000][1000];int main(){ int T; cin>>T; while(T--) { int N,V,value[1001],volume[1001]; cin>>N>>V; for(int i=1;i<=N;++i) cin>>value[i]; for(int i=1;i<=N;++i) cin>>volume[i]; for(int i=1;i<=V;++i){ if(volume[1]<=i) dp[1][i]=value[1]; else dp[1][i]=0; } for(int i=2;i<=N;++i){ for(int j=V;j>=0;--j){ if(j>=volume[i])//状态转移方程 dp[i][j]=max(dp[i-1][j],dp[i-1][j-volume[i]]+value[i]); else dp[i][j]=dp[i-1][j]; } } cout<
<

转载地址:https://blog.csdn.net/SCaryon/article/details/61922167 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:POJ 1837 Blance (01背包)
下一篇:循环队列,队链的实现

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年09月14日 09时13分46秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章