普通DP
5 1 6 1 4 3 3 0 3 2 2 3 3 3 3 2 1 0 2 4 2 5 0 0 1 0 4 4 1 3 3 4 3 4 4
12 4
/* *********************************************** Author :CKboss Created Time :2015年09月04日 星期五 08时51分26秒 File Name :HDOJ4501.cpp ************************************************ */ #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <string> #include <cmath> #include <cstdlib> #include <vector> #include <queue> #include <set> #include <map> using namespace std; int n,v1,v2,K; struct WP { int a,b,val; }wp[110]; int dp[2][110][110][110]; int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); while(scanf("%d%d%d%d",&n,&v1,&v2,&K)!=EOF) { for(int i=1;i<=n;i++) { scanf("%d%d%d",&wp[i].a,&wp[i].b,&wp[i].val); } memset(dp,0,sizeof(dp)); int now=1; int ans=0; for(int i=1;i<=n;i++) { for(int j1=K;j1>=0;j1--) /// i-1 物品的 k { for(int j2=v1;j2>=0;j2--) { for(int j3=v2;j3>=0;j3--) { int last=now^1; dp[now][j1][j2][j3]=max(dp[now][j1][j2][j3],dp[last][j1][j2][j3]); if(j1>0) dp[now][j1-1][j2][j3]=max(dp[now][j1-1][j2][j3],dp[last][j1][j2][j3]+wp[i].val); if(j2>=wp[i].a) dp[now][j1][j2-wp[i].a][j3]=max(dp[now][j1][j2-wp[i].a][j3],dp[last][j1][j2][j3]+wp[i].val); if(j3>=wp[i].b) dp[now][j1][j2][j3-wp[i].b]=max(dp[now][j1][j2][j3-wp[i].b],dp[last][j1][j2][j3]+wp[i].val); } } } if(i==n) { for(int j1=0;j1<=K;j1++) { for(int j2=0;j2<=v1;j2++) { for(int j3=0;j3<=v2;j3++) { int& t=dp[now][j1][j2][j3]; if(t>ans) ans=t; } } } } now=now^1; } printf("%d\n",ans); } return 0; }