题意要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;