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;

}
View Code

 

posted @ 2018-01-30 16:11  caomp  阅读(110)  评论(0)    收藏  举报