我正在尝试解决问题: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状态?