给出n个数,n小于等于5,不足5个数的剩下的自定,然后,先选3个数的和是1024的整数倍,如果没有则输出0,剩下两个数的和每次减1024直到小于等于1024为止
解法可以看这里,http://www.cnblogs.com/kuangbin/archive/2012/10/16/2725626.html
水题,只想说,剩下两个数的和每次减1024直到小于等于1024为止,要么你写while(s>1024) s-=1024;
要么你得写(s%1024==0 && s!=0)?1024:s%1024
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
#include <climits>
using namespace std;
int n;
int num[6];
int maxn=0;
int vis[6];
int allsum=0;
void dfs(int all,int pick,int now,int sum,int last_id){
if(now==pick){
if(all==5 && (allsum-sum)%1024!=0) return;
maxn=max((sum%1024==0 && sum!=0)?1024:sum%1024,maxn);
return;
}
for(int i=last_id+1;i<=all;i++){
if(!vis[i]){
vis[i]=true;
dfs(all,pick,now+1,sum+num[i],i);
vis[i]=false;
}
}
}
int main(){
#ifndef ONLINE_JUDGE
freopen("G:/in.txt","r",stdin);
//freopen("G:/myout.txt","w",stdout);
#endif
while(scanf("%d",&n)!=EOF){
maxn=0;
memset(num,0,sizeof(num));
allsum=0;
for(int i=1;i<=n;i++){
scanf("%d",&num[i]);
allsum+=num[i];
}
if(n<=3){
printf("1024\n");
continue;
}
else if(n==4){
if((num[1]+num[2]+num[3])%1024==0||
(num[1]+num[2]+num[4])%1024==0||
(num[2]+num[3]+num[4])%1024==0||
(num[1]+num[3]+num[4])%1024==0
){puts("1024");continue;}
maxn=0;
memset(vis,0,sizeof(vis));
dfs(4,2,0,0,0);
printf("%d\n",maxn);
}
else if(n==5){
maxn=0;
memset(vis,0,sizeof(vis));
dfs(5,2,0,0,0);
printf("%d\n",maxn);
}
}
return 0;
}