在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\n",dp[v][k-1]);
    }
    return 0;
}
View Code