CodeForces - 577B Modulo Sum(鸽巢原理+背包DP)

题目:

思路分析:

根据鸽笼原理来看 n大于m时候一定可以

然后可以利用dp来干

dp i j 代表前i个数 mod m为j的情况是否存在要看 前面是否存在 ((j-ai)%modm+m)modm是否存在

代码实现:

/*
*@Author:   GuoJinlong
*@Language: C++
*/
//#include <bits/stdc++.h>
/*
 *                                                     __----~~~~~~~~~~~------___
 *                                    .  .   ~~//====......          __--~ ~~
 *                    -.            \_|//     |||\\  ~~~~~~::::... /~
 *                 ___-==_       _-~o~  \/    |||  \\            _/~~-
 *         __---~~~.==~||\=_    -_--~/_-~|-   |\\   \\        _/~
 *     _-~~     .=~    |  \\-_    '-~7  /-   /  ||    \      /
 *   .~       .~       |   \\ -_    /  /-   /   ||      \   /
 *  /  ____  /         |     \\ ~-_/  /|- _/   .||       \ /
 *  |~~    ~~|--~~~~--_ \     ~==-/   | \~--===~~        .\
 *           '         ~-|      /|    |-~\~~       __--~~
 *                       |-~~-_/ |    |   ~\_   _-~            /\
 *                            /  \     \__   \/~                \__
 *                        _--~ _/ | .-~~____--~-/                  ~~==.
 *                       ((->/~   '.|||' -_|    ~~-/ ,              . _||
 *                                  -_     ~\      ~~---l__i__i__i--~~_/
 *                                  _-~-__   ~)  \--______________--~~
 *                                //.-~~~-~_--~- |-------~~~~~~~~
 *                                       //.-~~~--\
 *                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 *
 *                               神兽保佑            永无BUG
 */


const int MAX=1e6+5;
int dp[1005][1005];
int a[MAX];
int main(){
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    dp[0][0]=1;
    if(n>m){
        cout<<"YES"<<endl;
        return 0;
    }
    int flag=0;
    for(int i=1;i<=n;i++){
        for(int j=0;j<m;j++){
            int temp=((j-a[i])%m+m)%m;
            if(dp[i-1][temp]){
                dp[i][j]=1;
                if(j==0){
                    flag=1;
                    
                }
            }
            if(dp[i-1][j]){
                dp[i][j]=1;
            }
        }
    }
    if(flag) cout<<"YES";
    else cout<<"NO";
}

猜你喜欢

转载自blog.csdn.net/m0_57006708/article/details/121406535