CSES - Coin Combinations I 题解

CSES - Coin Combinations I

题目大意

\(n\) 种硬币,面值都为正整数,计算用这些硬币凑出总金额 \(x\) 的不同顺序的凑法数量。

解析

非常基础的完全背包。
但是爆零了很多次,照着标程能AC,一自己打就TLE。
这是我之前的代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,mod=1e9+7,a[105];
signed main(){
	ios::sync_with_stdio(0),cin.tie(0);
	cin>>n>>m;
	vector<int>dp(m+1);
	dp[0]=1;
	for(int i=1;i<=n;i++)	cin>>a[i];
	sort(a+1,a+n+1);
	for(int i=1;i<=m;i++){
	  for(int j=1;j<=n;j++){
		  	if(a[j]>i)	break;
			(dp[i]+=dp[i-a[j]])%=mod;
		}
	}
	cout<<dp[m];
	return 0;
}

几乎是交了到vjudge都要炸了,发现要是把 \(mod\) 定义成:

  const int mod=1e9+7;

就可以AC。
Deepseek的解释是:没吸氧的话,两种定义方式下写出代码运行时间会有较明显的差异。
但是让Deepseek写验证代码就很刺激了,本地验证跟理论不一致。
实测代码:


还是改习惯吧。
(先鸽一段时间,to be continue...)

AC Code

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,mod=1e9+7,a[105];
signed main(){
	ios::sync_with_stdio(0),cin.tie(0);
	cin>>n>>m;
	vector<int>dp(m+1);
	dp[0]=1;
	for(int i=1;i<=n;i++)	cin>>a[i];
	sort(a+1,a+n+1);
	for(int i=1;i<=m;i++){
		for(int j=1;j<=n;j++){
			if(a[j]>i)	break;
			(dp[i]+=dp[i-a[j]])%=mod;
		}
	}
	cout<<dp[m];
	return 0;
}
posted @ 2025-03-26 20:35  深申  阅读(72)  评论(0)    收藏  举报