一个奇怪的问题,蒟蒻希望大神来帮帮忙
查看原帖
一个奇怪的问题,蒟蒻希望大神来帮帮忙
399457
蜗牛与飞猪楼主2023/8/6 12:43

这是AC代码

#include<bits/stdc++.h>
using namespace std;

int m,n,k;
int a[10005];
bool dp[10005][105];

int main()
{
	cin>>m;
	for(int z=1;z<=m;z++)
	{
		memset(dp,0,sizeof(dp));
		cin>>n>>k;
		for(int i=1;i<=n;i++)
		{
			cin>>a[i];
			a[i]%=k;
		}
		dp[0][0]=1;
		dp[1][(a[1]+k)%k]=1;
		dp[1][(-a[1]+k)%k]=1;
		
		for(int i=2;i<=n;i++)
		{
			for(int j=0;j<k;j++)
			{
				if(dp[i-1][j])
				{
					dp[i][(j+a[i]+k)%k]=1;
					dp[i][(j-a[i]+k)%k]=1;
				}
			}
		}
		if(dp[n][0])cout<<"Divisible"<<endl;
		else cout<<"Not divisible"<<endl;
	}
	
	return 0;
}

我想问的是,为什么dp[1][(-a[1]+k)%k]=1 这一句代码去掉之后还能AC?

我之前一直没加这一段代码,调的时候看题解都有这一句,就加了上去,但是没有理解为什么要加,求助

如果大神有空来帮助我的话,麻烦看看这道一本通上基本一样的题目http://ybt.ssoier.cn:8088/problem_show.php?pid=1195 按照我的理解,这道一本通的题应该加dp[1][(-a[1]+k)%k]=1,但是不加也能过,说明我对这句代码没理解到位,麻烦大家解释一下

2023/8/6 12:43
加载中...