注册 登录
编程论坛 C++教室

帮忙写注释

yh3163 发布于 2022-07-28 12:50, 1215 次点击
#include<bits/stdc++.h>
using namespace std;  
bitset<501000> H;//H为一个二进制数组,每个元素是一个0或者1
int n,s=0,x;
int main(){
    freopen("competition.in","r",stdin);//文件输入输出
    freopen("competition.out","w",stdout);
    cin>>n;
    H[0]=true;
    for(int i=1;i<=n;i++){
        cin>>x;
        s+=x;
        H=H | (H<<x);
    }
    int x=0;
    for(int i=1;i<=s;i++)
        if(H[i] && i <= s-i) x=i;
    cout<<x<<" "<<s-x<<endl;
    return 0;
}
请各位大佬写下注释,必有重谢
7 回复
#2
yh31632022-07-28 12:58
题目如下
只有本站会员才能查看附件,请 登录
#3
rjsp2022-07-28 14:45
H每一位表示可能达到的重量;
假设当前可能达到的重量是 { 3, 5, 10 },这时又来了一个2斤的人,那新增可能的重量是 { 3+2, 5+2, 10+2 },此时可能达到的重量是 { 3, 5, 7, 10, 12 }

假如还不懂的话,你就拿几把直尺来模拟一下,以输入 { 1, 9, 2, 8 } 为例:
先在0cm处划一道线,此时直尺上有刻度的地方有 { 0 }
读入1后,把直尺上所有的划线向上复制1cm,此时直尺上有刻度的地方有 { 0, 1 }
读入9后,把直尺上所有的划线向上复制9cm,此时直尺上有刻度的地方有 { 0, 1, 9, 10 }
读入2后,把直尺上所有的划线向上复制2cm,此时直尺上有刻度的地方有 { 0, 1, 2, 3, 9, 10, 11, 12 }
读入8后,把直尺上所有的划线向上复制8cm,此时直尺上有刻度的地方有 { 0, 1, 2, 3, 8, 9, 10, 11, 12, 17, 18, 19, 20 }
最后,在{ 0, 1, 2, 3, 8, 9, 10, 11, 12, 17, 18, 19, 20 }这些刻度中挑选小于等于且最接近总重量一半的那个刻度



[此贴子已经被作者于2022-7-28 14:54编辑过]

#4
yh31632022-07-28 15:48
额,听懂了,但注释怎么写啊
#5
yh31632022-07-28 15:50
第十三行的代码不理解
#6
rjsp2022-07-28 18:28
以下是引用yh3163在2022-7-28 15:50:17的发言:

第十三行的代码不理解

假设,此时H表示 { 3, 5, 10 },又来了一个 x = 2 的人。
H<<x 表示所有重量都提高2,即 { 3+2, 5+2, 10+2 } 即 { 5, 7, 12 }
H|(H<<x) 表示 { 3, 5, 10 } 与 { 5, 7, 12 } 进行合并,即 { 3, 5, 7, 10, 12 }
#7
yh31632022-07-29 10:41
thankss
#8
yh31632022-07-31 13:41
thank
1