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;
}

浙公网安备 33010602011771号