B-牛牛想起飞-题解

牛牛想起飞

https://ac.nowcoder.com/acm/contest/9854/B

很容易发现是个dp,设计状态,dp[i][j]表示前i个数和为j的情况存不存在。存在就是1,不存在就是0,一开始再想能不能压成一维,其实是不可以的,因为最后要求的是n个数的和,如果压成一维就没办法确保是n个数的和了。

#include<bits/stdc++.h>
using namespace std;
int n,y;
int a[100010],b[100010];
bool dp[100010][110];//表示前i个数里和为j时,二维dp
{
    cin>>n>>y;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    } 
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&b[i]);
    }
    dp[1][a[1]]=1;
    dp[1][(a[1]+b[1])%y]=1;
    dp[1][(a[1]-b[1])%y]=1;
    for(int i=2;i<=n;i++)
    {
        for(int j=0;j<=101;j++)//前i个数里和为j的情况 
        {
            if(dp[i-1][j])//有才能转移
            {
                dp[i][(j+a[i])%y]=1;
                dp[i][(j+a[i]+b[i])%y]=1;
                dp[i][(j+a[i]-b[i])%y]=1;
            } 
        }
    }
    for(int i=101;i>=0;i--) 
    {
        if(dp[n][i])
        {
            cout<<i;
            return 0;
        }
    }
    return 0;
}
全部评论
感谢大佬QAQ,看了你的思路,我仔细想了下其实可以压缩到一维,具体代码实现我一会发到题解区。
点赞 回复
分享
发布于 2021-01-01 14:35
这个要不要考虑和为负数的情况
点赞 回复
分享
发布于 2021-01-01 15:38
联想
校招火热招聘中
官网直投
您好,请问一下第16行,dp[1][a[1]]=1; 为什么不写成dp[1][a[1]%y]=1,这两者有什么区别吗?
点赞 回复
分享
发布于 2021-01-18 14:59

相关推荐

6 收藏 评论
分享
牛客网
牛客企业服务