1.给出N * N个数字(N<=4)和一个N * N的方格,每个数字填入一个方格,使得最终方格每行每列和每个对角线上的和都相等。
感觉硬搜索不行,求助思路
2.题目:给定N个数,第i个数的值为Ai,你现在可以从中选择一些数字,问选出数字的和模P最大为多少。
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
register int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=(x<<3)+(x<<1)+(c^48);
c=getchar();
}
return x*f;
}
bool cmp(int x,int y){return x>y;}
int n,p,maxx;
int a[40];
void dfs(int i,int now)
{
if(now==p-1)
{
cout<<now;
exit(0);
}
if(i==n)
{
now+=a[i];
now=now%p;
maxx=max(now,maxx);
return;
}
dfs(i+1,(now+a[i])%p);
dfs(i+1,now%p);
}
signed main()
{
n=read(),p=read();
for(int i=1;i<=n;i++) a[i]=read()%p;
sort(a+1,a+n+1,cmp);
dfs(0,0);
cout<<maxx;
return 0;
}
n<=35,但是我这份代码被卡了(但我不知道怎么剪枝)。
qwq