cf#319-div2-B. Modulo Sum-(dp) 求模

题意要n个数中 看能否选出一个组合,使其之和为 m的倍数

开一个dp[1001]、tmp_dp[1001]

dp[i]的意思,是能得到 一个组合,其和为sum 且sum%m==i 那么我们就让dp[i]=1;表示存在

在递推的过程中,如果我们在前i个数得到dp[j]=1;也就是存在sum1%m==j;

那么对于a[i+1]、我们可以推得  一个sum2=sum1+a[i+1]、所以得到sum2%m==k; 也就是dp[k]=1;

即: 由在前i次循环中,如果得到dp[j]=1;可以在第i+1次循环得到  dp[   ( j+a[i+1] )%m   ]=1;

这里为什么强调前i次循环和第i+1次循环? 因为要得到dp[k]=1,其条件中的dp[j]=1;必须在 a[i+1]的递推之前就已经得到

这里给个反例,  a[1]=1,m=100如果我从a[1]=1;推得dp[1%100]=dp[1]=1; 然后我又根据这个dp[1]=1得到dp[(1+a[1])%100]=dp[2]=1;这样就一直推下去了

所以我们在从dp[j]推到dp[k]的时候,dp[k]应该记录在一个tmp_dp[k]数组里(为了不在递归中影响dp数组的值)

做完整个递推后,才把tmp_dp[]的值赋给dp;


<
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值