在dp问题中如果遇到问题,没有什么是加一维度不能解决的,如果不能,再加一维度。
#include<iostream> #include<cstring> #include<cstdio> #include<cstdlib> #include<algorithm> using namespace std; int main() { int t; scanf("%d",&t); while(t--) { int n,v,k; scanf("%d%d%d",&n,&v,&k); int dp[v+1][k+1],w[n],c[n]; for(int i=0;i<n;++i) scanf("%d",&w[i]); for(int i=0;i<n;++i) scanf("%d",&c[i]); memset(dp,0,sizeof(dp)); for(int i=0;i<n;++i) { int ic = c[i]; int iw = w[i]; for(int iv = v;iv>=ic;--iv) { int tempA[k+1],tempB[k+1]; int ia,ib,ik; ia = ib = ik = 0; for(;ik<k;++ik) { tempA[ia++] = dp[iv][ik]; tempB[ib++] = dp[iv-ic][ik] + iw; } tempA[ia] = -1; tempB[ib] = -1; ia = ib = ik = 0; while(ik<k&&(tempA[ia]!=-1||tempB[ia]!=-1)) { if(tempA[ia] > tempB[ib]) { dp[iv][ik] = tempA[ia++]; } else { dp[iv][ik] = tempB[ib++]; } if(ik==0 || dp[iv][ik] != dp[iv][ik-1]) { ++ik; } } } } printf("%d ",dp[v][k-1]); } return 0; }