如何减少DP(动态编程)状态?

时间:2017-08-15 09:29:59

标签: c++ state dynamic-programming

我正在尝试解决问题:http://www.spoj.com/problems/BUD13TLF/

问题在于我的DP状态: 我有这样的递归: 让 k =剩余空格,访问[] 数组以跟踪访问过的元素,数组 a [] 代表w1,w2,... wn 。和函数 int solve(k,visited [])是我的函数,它返回ans 这是我的功能:

int solve(int k,vector<bool> vis){

    if(k<0)return 0;
    if(k==0)return 1;
    int ans=1;
    loop(i,n){
        if(!vis[i]){
            vis[i]=1;
            ans+=solve(k-a[i],vis)%MOD;
            vis[i]=0;int j;
            for(j=i+1;a[j]==a[i];j++);
            j--;
            i=j;
        }
    }
    if(ans!=1) ans--;
    return ans;
}

问题是如何定义我的DP状态,因为访问(矢量/数组)可能很大(如果我选择位掩码或位集,最多2 ^ 100种可能性)?如果我的DP状态依赖于整个阵列,还请评论如何表示DP状态?

0 个答案:

没有答案