13 条题解

  • 12
    @ 2023-4-15 11:58:57

    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日

    • @ 2023-8-23 8:07:05

      楼主可以将头文件改为 #include <bits/stdc++.h> 这样只用写一个头文件

  • 6
    @ 2023-7-29 15:25:05

    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
      @ 2024-4-24 21:02:40

      一个赞 #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分

      证明完毕。数学老师哭了!

      因为,毫无破绽。稀里糊涂地钱就没了……正如现在的社会!!!

      笑话结束,点个赞吧,求求了; 下一个题还有三个,期待吧。。。。。。

      • @ 2024-6-1 20:19:33

        第三个笑话算式本身就有问题,应该是100分=10分×10,不应该是10分×10分。

    • 2
      @ 2023-2-27 17:10:10
      题目大意
              存在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
        @ 2024-3-29 19:55:22
        #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
          @ 2024-2-29 23:00:17

          不必多讲

          #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;
          }
          
          • @ 2024-3-9 10:46:00

            只保留主要代码 立即删除!

        • 0
          @ 2024-2-25 16:24:31

          参考代码:

          #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
            @ 2024-1-21 18:13:34

            这题说要将一组数分成两部分,但是却没有指出分割的长度,基本可以确定是子集枚举;“两部分数字之和”说明需要在枚举的过程中将两部分的数分别求和;“差值小于等于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
              @ 2023-11-24 23:58:08
              #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
                @ 2023-7-28 17:38:07

                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
                  @ 2023-4-15 18:54:19
                  • #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 *

                  • @ 2024-3-9 10:45:34

                    只保留主要代码 立即删除!

                • -3
                  @ 2024-4-3 20:35:56

                  这题可以直接二进制枚举

                  #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
                    @ 2023-4-16 19:51:25

                    #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
                  上传者