codevs 2925 整除问题

本文介绍了一种解决整除问题的有效方法——动态规划。通过构建n*k的二维数组来存储取余的可能性,并逐步推进解决问题。文章提供了一个简洁易懂的C++实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这次是整除问题。

刚读完题时,相信很多人会和我一样,脑中闪现的词语一定是——“搜索”。确实,所谓“搜索是万能的”,本题用搜索确实可以做,但“搜索也是万万不能的”,当你提交后,一个残酷的事实摆在了你面前——超时!此时的你一定欲哭无泪。既然搜索超时,就要转变方法。经过仔细考虑,另一种方法估计已经在你脑中成型了——DP(Dynamic Programming),没错,动态规划。

对于这个题你需要将两正一反的三条线与n*k的二维数组结合起来,利用二维数组存储取余的可能性,一行一行地向下推进。

当你的思维量达到极致时,本题的代码就会极简单。相信它也已经在你手下自然而然的成型了吧。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;

int n,k;
int num[10000+2][100+2],A[10000+2];

int main() {
	
	scanf("%d %d",&n,&k);
	for(int i=0;i<n;++i)scanf("%d",A+i);
	
	num[0][A[0]%k]=1;
	for(int i=0;i<n;++i){
		for(int j=0;j<k;++j){
			if(num[i][j]){
				num[i+1][(j+A[i+1])%k]=1;
				if((j-A[i+1]%k)<0)num[i+1][(j-A[i+1])%k+k]=1;
				else num[i+1][(j-A[i+1])%k]=1;
			}
		}
	}
	
	if(num[n-1][0])printf("Divisible\n");
	else printf("Not divisible\n");
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值