13 条题解
-
12
P1020 完美的数
题目描述
现给定n个数,要求将这组数分成两部分,两部分数字之和的差值小于等于10,就代表这n个数是完美的,请你算出有多少种分法,可以证明这组数是完美的数。
思路
计算存在多少情况,能将这些数分成两部分,这两部分之和的差不超过10
其实就是找个子集加到num1,把不是子集的数字加到num2,再比较一下。
for(int j = 0;j < n;j++) { if(i & (1 << j)) { sum1 += a[j]; } else { sum2 += a[j]; } } if(abs(sum1 - sum2) <= 10) { num++; }
注意:
一一对应,如果你的true point是1,那么考虑他;
参考代码:
#include <iostream> #include <algorithm> using namespace std; int a[20],num,sum1,sum2; int main() { int n; cin >> n; for(int i = 0;i < n;i++) { cin >> a[i]; } for(int i = 1;i < (1 << n);i++) { sum1 = 0; sum2 = 0; for(int j = 0;j < n;j++) { if(i & (1 << j)) { sum1 += a[j]; } else { sum2 += a[j]; } } if(abs(sum1 - sum2) <= 10) { num++; } } cout << num << endl; }
hetao3097453
2023年4月15日
-
6
P1020
-题目回顾-
现给定n个数,要求将这组数分成两部分,两部分数字之和的差值小于等于10,就代表这n个数是完美的,请你算出有多少种分法,可以证明这组数是完美的数。
-分析-
使用子集枚举,在子集里的数加起来为s1,剩下的加起来为s2,s1-s2一定大于等于-10且小于等于10,以这个作为
if
语句的判断条件即可
-代码-
#include <iostream> using namespace std; int n, s, a[21], ans = 1000000, num; int main()// by AGOMG { cin >> s; for (int i = 1; i <= s; i++) { cin >> a[i]; } for (int i = 0; i < (1 << s); i++) { int s1 = 0, s2 = 0; for(int j = 0; j < s; j++) { if(i & (1 << j)) { s1 += a[j + 1]; } else { s2 += a[j + 1]; } } if(s1 - s2 <= 10 && s1 - s2 >= -10) num++; } cout << num; return 0; }
-
4
一个赞 #include <iostream> #include <algorithm> using namespace std; int a[20],num,sum1,sum2; int main() { int n; cin >> n; for(int i = 0;i < n;i++) { cin >> a[i]; } for(int i = 1;i < (1 << n);i++) { sum1 = 0; sum2 = 0; for(int j = 0;j < n;j++) { if(i & (1 << j)) { sum1 += a[j]; } else { sum2 += a[j]; } } if(abs(sum1 - sum2) <= 10) { num++; } } cout << num << endl; } 笑话时间到(3个); 1:早上走在幼儿园门口时! 一哥们,急刹车把车停到车位上,下车后还大声的喊:“儿子!快下车,...要迟到啦!”,然后打开车门:“ 我的神呢、孩子忘带啦... ... 2:有个老头子去看病,医生给他开了一副药然后对他说:"药效十二小时”。
老头子点了头就笑着走了,老头子边走边笑,回到家还在不停的笑啊笑。
家人奇怪就问:“你怎么回事啊?”老头说:“这医生开的什么药啊,要笑十二个小时,笑得快累死了!” 3: 某同学为了证明钱缩水,做了一道题,把数学老师逼疯了!
高级数学题:
求证:1元=1分
解:1元=100分=10分×10分=1角 ×1角=0.1元×0.1元=0.01元=1分
证明完毕。数学老师哭了!
因为,毫无破绽。稀里糊涂地钱就没了……正如现在的社会!!!
笑话结束,点个赞吧,求求了; 下一个题还有三个,期待吧。。。。。。
-
2
题目大意
存在n个数,计算存在多少种情况,能将n个数分成两部分,这两部分数字之和差距不超过10
提示
将n个数分成两部分,可以转化为找出n个数的一个子集,子集外的数字便是另一部分
完整思路
将n个数视为全集,找出所有的子集,每次找出子集时,将找出的子集视为一部分,子集外的数视为另一部分,若两部分的总和的差距小于等于10,代表该分法能证明这组数为完美的数。
核心代码
for (int i = 1; i < (1 << n); i++) { int sum1 = 0; int sum2 = 0; for (int j = 0; j < n; j++) if (i & (1 << j)) sum1 += a[j]; else sum2 += a[j]; if (abs(sum1 - sum2) <= 10) num++; }
-
0
#include <iostream> #include <algorithm> using namespace std; int a[20],num,sum1,sum2; int main() { int n; cin >> n; for(int i = 0;i < n;i++) { cin >> a[i]; } for(int i = 1;i < (1 << n);i++) { sum1 = 0; sum2 = 0; for(int j = 0;j < n;j++) { if(i & (1 << j)) { sum1 += a[j]; } else { sum2 += a[j]; } } if(abs(sum1 - sum2) <= 10) { num++; } } cout << num << endl; }
-
0
不必多讲
#include <bits/stdc++.h> using namespace std; int n,ans,a[25]; int main(){ cin>>n; for (int i=1;i<=n;i++)cin>>a[i]; for (int i=0;i<(1<<n);i++){ int sum1=0,sum2=0; for (int j=0;j<n;j++)i&(1<<j)?sum1+=a[j+1]:sum2+=a[j+1]; if (abs(sum1-sum2)<=10)ans++; } cout<<ans; return 0; }
-
0
参考代码:
#include<bits/stdc++.h>//万能头文件 using namespace std; int a[20],num,sum1,sum2;//定义 int main() { int n; cin >> n; for(int i = 0;i < n;i++) { cin >> a[i]; } for(int i = 1;i < (1 << n);i++) { sum1 = 0; sum2 = 0; for(int j = 0;j < n;j++) { if(i & (1 << j)) { sum1 += a[j]; } else { sum2 += a[j]; } } if(abs(sum1 - sum2) <= 10) { num++; } } cout << num << endl; }
请勿一口吞噬😄 亲测有效
主要代码 int n; cin >> n; for(int i = 0;i < n;i++) { cin >> a[i]; } for(int i = 1;i < (1 << n);i++) { sum1 = 0; sum2 = 0; for(int j = 0;j < n;j++) { if(i & (1 << j)) { sum1 += a[j]; } else { sum2 += a[j]; } } if(abs(sum1 - sum2) <= 10) { num++; } }
-
0
这题说要将一组数分成两部分,但是却没有指出分割的长度,基本可以确定是
子集枚举
;“两部分数字之和”说明需要在枚举的过程中将两部分的数分别求和
;“差值小于等于10”说明在程序求和完后还需要再进行一步比较;代码如下:
#include <iostream> #include <algorithm> #include <cmath> using namespace std; int n,a[25],s1,s2,sum; int main() { cin>>n; for (int i=1;i<=n;i++) cin>>a[i]; for (int i=1;i<=(1<<n);i++) { s1=0;s2=0; for (int j=0;j<n;j++) if (i & (1<<j)) s1+=a[j+1]; else s2+=a[j+1]; if (abs(s1-s2)<=10) sum++; } cout<<sum; return 0; }
-
0
#include <bits/stdc++.h> using namespace std; int n, a[25], sum1, sum2, ans; int main() { cin >> n; for (int i = 0; i < n; i++) cin >> a[i]; for (int i = 0; i < (1 << n); i++) { sum1 = 0; sum2 = 0; for (int j = 0; j < n; j++) { if (i & (1 << j)) sum1 += a[j]; else sum2 += a[j]; } if (sum1 - sum2 >= -10 && sum1 - sum2 <= 10) ans++; } cout << ans; return 0; }
-
0
P1020 完美的数
题目描述
现给定n个数,要求将这组数分成两部分,两部分数字之和的差值小于等于10,就代表这n个数是完美的,请你算出有多少种分法,可以证明这组数是完美的数。
与L9-5-8很像
先说说思路 使用子集枚举在子集里的累加进入sum1,else 累加进入sum2
核心代码:
for(int i=1;i<(1<<s);i++){ int sum1=0,sum2=0; for (int j = 0; j < s; j++){ if (i & (1 << j))sum1+=a[j+1]; else sum2+=a[j+1]; }if(abs(sum1-sum2)<=10)ans++; }
定义改一下:
int n,s,a[21],ans;
头文件改一下
#include <bits/stdc++.h> using namespace std;
o了:
#include<bits/stdc++.h> using namespace std; int n,s,a[21],ans; int main(){ cin >> s; for(int i=1;i<=s;i++)cin >> a[i]; for(int i=1;i<(1<<s);i++){ int sum1=0,sum2=0; for (int j = 0; j < s; j++){ if (i & (1 << j))sum1+=a[j+1]; else sum2+=a[j+1]; }if(abs(sum1-sum2)<=10)ans++; }cout<<ans; return 0; }
-
-1
-
#include <iostream> #include <algorithm> using namespace std; int a[20],num,sum1,sum2; int main() { int n; cin >> n; for(int i = 0;i < n;i++) { cin >> a[i]; } for(int i = 1;i < (1 << n);i++) { sum1 = 0; sum2 = 0; for(int j = 0;j < n;j++) { if(i & (1 << j)) { sum1 += a[j]; } else { sum2 += a[j]; } } if(abs(sum1 - sum2) <= 10) { num++; } } cout << num << endl; return 0; }
Copy *
-
-
-3
这题可以直接二进制枚举
#include <bits/stdc++.h> using namespace std;
int a[105];
int main(){ int n; cin>>n; for (int i=1;i<=n;i++) cin>>a[i]; int sum=0; for (int i=1;i<=(1<<n);i++){ int t=0; int sum1=0; int sum2=0; for (int j=0;j<n;j++) if (i&(1<<j)) sum1+=a[j+1]; else sum2+=a[j+1]; t=abs(sum1-sum2); if (t<=10) sum++; } cout<<sum<<endl; return 0; }
-
-14
#include<bits/stdc++.h> using namespace std; int a[20],num,sum1,sum2; int main(){ int n; cin>>n; for(int i=0;i<n;i++)cin>>a[i]; for(int i=1;i<(1<<n);i++){ sum1=0; sum2=0; for(int j=0;j<n;j++){ if(i&(1<<j))sum1+=a[j]; else sum2+=a[j]; } if(abs(sum1-sum2)<=10)num++; } cout<<num<<endl; return 0; }
- 1
信息
- ID
- 13
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 1918
- 已通过
- 990
- 上传者