中了一个坑,循环时竟然从该物品的价格和分数开始,中招了,因为就算价格高于钱数,可能分数符合呢????所以要从零开始。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; int dp[102][102][102][7]; int n,v1,v2,k; struct Node{ int v1,v2,c; }node[111]; int main(){ while(scanf("%d%d%d%d",&n,&v1,&v2,&k)!=EOF){ for(int i=1;i<=n;i++){ scanf("%d%d%d",&node[i].v1,&node[i].v2,&node[i].c); } memset(dp,0,sizeof(dp)); int ans=0; for(int e=1;e<=n;e++){ for(int i=0;i<=v1;i++){ for(int j=0;j<=v2;j++){ for(int l=0;l<=k;l++){ dp[e][i][j][l]=dp[e-1][i][j][l]; if(i-node[e].v1>=0) dp[e][i][j][l]=max(dp[e][i][j][l],dp[e-1][i-node[e].v1][j][l]+node[e].c); if(j-node[e].v2>=0) dp[e][i][j][l]=max(dp[e][i][j][l],dp[e-1][i][j-node[e].v2][l]+node[e].c); if(l>0) dp[e][i][j][l]=max(dp[e][i][j][l],dp[e-1][i][j][l-1]+node[e].c); ans=max(ans,dp[e][i][j][l]); } } } } printf("%d\n",ans); } return 0; }
时间: 2024-10-25 07:50:15