• ZCMU--5129: 校园寻宝(C语言)


    Description

    小明漫步在校园里的时候,突然看到实验楼门口插着一块牌子,上面写着“此地无银三百两~”。显然这样的牌子下面是一定可以挖到宝藏,于是小明便找了个月黑风高的夜晚开挖,果然挖出了n块宝石,每块宝石有一个价值ai。

    可月黑风高也并不保险,半夜被关在实验楼出不去的小红全程目睹了小明的寻宝过程,小红仗着自己是小明的好朋友要求分这些宝石,小红想了一个办法:将这n块宝石分成两堆,小红拿走价值大的那堆,剩下的一堆让小明领走。

    小明伤心极了,希望你来帮他选择一种分配方案,告诉他最多可以获得总价值为多少的宝石。

    Input

    第一行包含一个整数t(1≤t≤10) ,是测试用例的数量,接下来2t行包含测试用例的描述。

    每个测试用例的第一行包含一个整数n(1≤n≤3000)。

    每个测试用例的第二行包含n个整数a1,…,an(1≤ai≤5000)-ai等于第i个宝石的价值。

    数据保证所有n的总和不大于3000,所有ai总和不大于5000。

    Output

    对于每个测试用例,输出小明最多可以获得的宝石总价值

    Sample Input

    2

    4

    10  130  170  50

    3

    200  60  100

    Sample Output

    180

    160

    解析:因为要尽可能平分,假如所有物品价值和为S,那么最理想就是S/2,变成了S/2容量的背包,最多能装多少,然后跟01背包一样即可。

    1. #include
    2. #include
    3. int w[3005],k[5005];
    4. int main()
    5. {
    6. int t,n,i,j,s;
    7. scanf("%d",&t);
    8. while(t--){
    9. memset(k,0,sizeof(k));//多组输入,初始化清空
    10. scanf("%d",&n);
    11. s=0;//用来累加物品价值和
    12. for(i=1;i<=n;i++) scanf("%d",&w[i]),s+=w[i];
    13. for(i=1;i<=n;i++){
    14. for(j=s/2;j>=w[i];j--){
    15. if(k[j-w[i]]+w[i]>k[j]) k[j]=k[j-w[i]]+w[i];
    16. }
    17. }
    18. printf("%d\n",k[s/2]);
    19. }
    20. return 0;
    21. }

  • 相关阅读:
    安徽建筑模板厂家供应商实力之选-能强优品木业
    计算ip是否在网络段(子网掩码)
    Mac 上终端使用 MySql 记录
    中枢听觉处理障碍的行为干预方法
    515. 在每个树行中找最大值
    套接字介绍
    jmeter-操作mysql
    Maven Dependency 机制
    Linux应用开发进程间通信 视频课笔记
    【C++】类的封装 ③ ( 访问控制权限 )
  • 原文地址:https://blog.csdn.net/qq_63739337/article/details/126383725