HDU 2602 Bone Collector(dp)

来源:互联网 发布:淘宝联盟推广赚钱 编辑:程序博客网 时间:2024/05/16 12:21

题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=2602


一道简单的0-1背包问题,初次学习动态规划,作简单总结。


题目大意:有个人爱收集一些化石,每种化石都有相应的体积和价值,这个人有一个容量为V的背包,求这个包所装进化石的最大价值为多少。


输入:

T个实例

N种化石,背包容量为V

每种化石的价值

每种化石的体积


输出:

最大价值


code:

#include<stdio.h>#include<string.h>#include<iostream>using namespace std;int dp[1001];struct node{int val;int vol;}a[1001];int main(){int i,T,N,V;cin>>T;while(T--){cin>>N>>V;for(i=1;i<=N;i++)cin>>a[i].val;for(i=1;i<=N;i++)cin>>a[i].vol;for(i=1;i<=N;i++)for(int j=V;j>=a[i].vol;j--) dp[j]=max(dp[j],dp[j-a[i].vol]+a[i].val);cout<<dp[V]<<endl;}return 0;}

“将前i件物品放入容量为v的背包中”这个子问题,若只考虑第i件物品的策略(放或不放),那么就可以转化为一个只牵扯前i件物品的问题。如果不放第i件物品,那么问题就转化为“前i件物品放入容量为v的背包中”,价值为dp[j];如果放第i件物品,那么问题就转化为“前i件物品放入剩下的容量为j-vol[i]的背包中”,此时能获得的最大价值就是dp[j-vol[i]]再加上通过放入第i件物品获得的价值val[i]。

0 0
原创粉丝点击