B:dp[i][2],表示从i出发的结果(要么走到挂,要么循环),记忆化搜索就好了,每次要注意判环
C:问你有多少种组合满足Q个条件,每个条件的形式是硬币a出现的次数 大于 硬币b出现的次数 ,先类似于传递闭包搞一下,判掉自己大于自己的情况,然后再用背包来做,每次放进来一个硬币就相当于把出现次数比这个硬币多的硬币都放进来了,由此知道了物品的体积,这是关键所在吧。
[cpp]
dp[0] = 1;
for(int i = 0; i < n; i++)
{
if(!zero[i])
{
for(int j = m; j >
= 0; j--) //先放一次
{
if(j >= c[i])
{
dp[j] = dp[j-c[i]];
}
else dp[j] = 0;
}
}
for(int j = c[i]; j <= m; j++) //放多次
{
dp[j] += dp[j-c[i]];
dp[j] %= mod;
}
}
D
E