HDU 2602(DP初步_E题)解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602
-----------------------------------------------------------------------------------
题意:给定背包体积V,N个骨头分别给出价值val[i]和体积vme[i],要求给出最大价值。
思路:0-1背包问题,可以选择放入或者不放入。
状态转移方程为:f[j]=max(f[j],f[j-vme[i]]+val[i])(经典的0-1背包的状态转移方程)
代码:
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<string> #include<vector> #include<stack> #include<bitset> #include<cstdlib> #include<cmath> #include<set> #include<list> #include<deque> #include<map> #include<queue> using namespace std; typedef long long ll; const double PI = acos(-1.0); const double eps = 1e-6; int T =0; const int MAXN= 1e4+10; int f[MAXN]; const int initN = 1e3+10; int val[initN]; int vme[initN]; int main(void){ scanf("%d",&T); for(int t=0;t<T;t++){ int N ,V; scanf("%d %d",&N,&V); for(int c=0;c<N;c++){ scanf("%d",&val[c]); } for(int c=0;c<N;c++){ scanf("%d",&vme[c]); } for(int i=0;i<=V;i++){ f[i]=0; } for (int i=0; i<N; i++){ for (int j=V; j>=0; j--){ if (vme[i]<=j){ f[j]=max(f[j],f[j-vme[i]]+val[i]); } } } printf("%d\n",f[V]); } return 0; }

浙公网安备 33010602011771号