2018山东冬令营:数学题
问题 A: 数学题
时间限制: 1 Sec 内存限制: 128 MB提交: 62 解决: 22
[提交][状态][讨论版]
题目描述
给出一个n个未知数的方程,x[1],x[2],x[3]......x[n]
求x[1]+x[2]+x[3]....+x[n]==S的正整数解的个数,并且要保证,
对于任意i (1<=i< n) x[i]与x[i+1]相差不大于P;
求x[1]+x[2]+x[3]....+x[n]==S的正整数解的个数,并且要保证,
对于任意i (1<=i< n) x[i]与x[i+1]相差不大于P;
输入
第一行三个整数n,S,P。
输出
一行一个整数表示方程解的个数。
样例输入
2 10 2
样例输出
3
提示
三种情况分别是:
5+5=10
4+6=10
6+4=10
对于 30% 数据 2<=n<=10 ,p=0,S<=30;
对于 100% 数据 2<=n<=10,p<=3 , S<=30;
保证数据有梯度。
【思路】
DFS 搜索,就可以, pre 记录前驱, 注意剪枝
【代码实现】
#include <iostream> #include <bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; typedef long long ll; const int MAXN=1e6+5; const ll INF=0x3f3f3f3f; int n,s,p; int a[5000]; int sc; void dfs(int cot,int sum,int pre) { if(sum>s) return ; if(cot==n-1) { if(sum==s) { //cout<<sum<<" "<<pre<<endl; sc++; } return ; } for(int i=min(pre,1);i<=max(pre,s);i++) { if( abs(i-pre)<=p ) dfs(cot+1,sum+i,i); } } int main() { sc=0; cin>>n>>s>>p; for(int i=1;i<=30;i++) dfs(0,i,i); cout<<sc<<endl; return 0; }
123
岂曰无衣?与子同袍。王于兴师,修我戈矛。与子同仇!
岂曰无衣?与子同泽。王于兴师,修我矛戟。与子偕作!
岂曰无衣?与子同裳。王于兴师,修我甲兵。与子偕行!