解题思路:
说明一下哪两个优化,首先我是先给数据从大到小排好序的,如果你在安排第二个数的时候你选择的第一个数还没有最大值的1/3大,你后面选择的两个数必定小于第一个数,因此不可能超过最大值,直接回溯,两个优化都是这个思想。
注意事项:
参考代码:
#include#includeusing namespace std; int a[100010]; int n,k; bool vis[100010]; int cnt; void dfs(int x,int sum){ if(x>=4){ if(sum%k==0) cnt = max(cnt,sum); return; } if(x==3&&sum<cnt*2/3) //优化前36 优化后66 相当于减去挑选第二个数时很小的情况 return; if(x==2&&sum=0;i--){ if(!vis[i]){ vis[i] = true; dfs(x+1,sum+a[i]); vis[i] = false; } } } int main(){ cin>>n>>k; for(int i=0;i<n;i++) scanf("%d",&a[i]); sort(a,a+n); dfs(1,0); cout<<cnt; return 0; }
0.0分
4 人评分
Biggest Number (C++代码)回溯法浏览:1676 |
C语言程序设计教程(第三版)课后习题6.4 (C语言代码)浏览:573 |
【绝对值排序】 (C++代码)浏览:720 |
【出圈】 (C语言代码)浏览:824 |
C语言程序设计教程(第三版)课后习题4.9 (C语言代码)浏览:634 |
C语言程序设计教程(第三版)课后习题6.11 (C语言代码)浏览:2098 |
C语言程序设计教程(第三版)课后习题6.5 (C语言代码)浏览:660 |
printf基础练习2 (C语言代码)浏览:796 |
C语言训练-亲密数 (C语言代码)浏览:697 |
P1000 (C语言代码)浏览:911 |
flags 2021-04-13 17:12:21 |
我加了解释你可以看看