小李打怪兽——01背包

小李打怪兽——01背包题目描述小李对故乡的思念全部化作了对雾霾天气的怨念,这引起了掌控雾霾的邪神的极大不满,邪神派去了一只小怪兽去对付小李,由于这只怪兽拥有极高的IQ,它觉得直接消灭小李太没有难度了,它决定要和小李在智力水平上一较高下。我们可否帮助小李来战胜强大的怪兽呢?问题是这样的:给定一堆正整数,要求你分成两堆,两堆数的和分别为S1和S2,谁分的方案使得S1*S1-S2*S2的结果小(规定S1>=S2)…

大家好,又见面了,我是你们的朋友全栈君。

题目描述

小李对故乡的思念全部化作了对雾霾天气的怨念,这引起了掌控雾霾的邪神的极大不满,邪神派去了一只小怪兽去对付小李,由于这只怪兽拥有极高的IQ,它觉得直接消灭小李太没有难度了,它决定要和小李在智力水平上一较高下。我们可否帮助小李来战胜强大的怪兽呢?
问题是这样的:给定一堆正整数,要求你分成两堆,两堆数的和分别为S1和S2,谁分的方案使得S1*S1-S2*S2的结果小(规定S1>=S2),谁就将获得胜利。
注:S2可以等于0。

输入

第一行n(1<=n<=100),表示共有n个数
第二行共n个用空格隔开的正整数ai(ai<=100),表示给定的一堆正整数。

输出

输出就一个整数,表示 S1*S1-S2*S2 的最小值。

样例输入

4 
1 2 3 4

样例输出

0

 

一开始根本没想到是背包问题,后来补题时慢慢想出来了(这小学组的题我做不来…..)

 

如题意:要把n个数分成两份,这两份尽可能接近

也就是说其中一份大于等于总和的一半,另一份小于等于,

然后我们看小于等于的那一份,

就是说要在n个数里找出m(m未知)个数使其和小于等于sum/2、且最大,自然剩余n-m个数的和大于等于sum/2、且最小

这两部分就最接近了,

关键就是找这m个数了,

这就等价与n个物品,sum/2的背包(价值与重量相等)

附上01背包模板代码

 

for(i = 0;i<n;i++)//n件物品
{
      for(j = s ;j>=vi[i];j++)//背包容积
      {
          dp[j] = max(dp[j], dp[j-vi[i]]+wi[i]);//递推公式
      }
}

 

 

 

Ac代码

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define ll long long
using namespace std;

int main()
{
    int dp[10000];
    int a[1000];
    int n,s=0;
    cin>>n;

    for(int i=0;i<n;i++)
        cin>>a[i],s+=a[i];
    for(int i=0;i<n;i++)
    {

        for(int j=s/2;j>=a[i];j--)
        {
            if(j>=a[i])
                dp[j]=max(dp[j],dp[j-a[i]]+a[i]);
        }
        /*for(int j=0;j<=s/2;j++)
            printf("%d\t",dp[j]);
        printf("\n");*/
    }
    cout<<(s*(s-2*dp[s/2]))<<endl;



return 0;
}

 

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define ll long long
using namespace std;
int dp[105][10000];
int main()
{

    int a[105];
    int n,s=0;
    cin>>n;

    for(int i=1;i<=n;i++)
        cin>>a[i],s+=a[i];
    for(int i=1;i<=n;i++)
    {

        for(int j=0;j<=s/2;j++)
        {
            if(j>=a[i])
                dp[i][j]=max(dp[i-1][j],dp[i-1][j-a[i]]+a[i]);
            else
                dp[i][j]=dp[i-1][j];
        }
    }
    cout<<(s*(s-2*dp[n][s/2]))<<endl;

return 0;
}

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/161548.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 线性回归 均方误差_线性回归模型中随机误差项的意义

    线性回归 均方误差_线性回归模型中随机误差项的意义刚开始学习机器学习的时候就接触了均方误差(MSE,MeanSquaredError),当时就有疑惑,这个式子是怎么推导的,但是因为懒没有深究。今天看到了唐宇迪老师的机器学习课程,终于理解他是怎么推导的了。问题描述我们有工资和年龄两个特征,要预测银行会带宽给我们多少钱。1.拟合函数假设:年龄:x1x_1x1​工资:x2x_2x2​年龄的参数:θ1θ_1θ1​工资的参数:θ2θ_2θ2​那么有拟合函数:(1)将它转化为矩阵表达形式为:(2)其中x0全为1。2.误差真实值和预

    2022年9月29日
  • Odin Inspector 系列教程 — List Drawer Settings Attribute

    Odin Inspector 系列教程 — List Drawer Settings AttributeListDrawerSettingsAttribute自定义数组或者列表绘制方式Odin已经重写对应的数组和列表的绘制[Title(“ListBasics”)][InfoBox(“现在可以拖动列表元素来重新排序并逐个删除它们,并且列表具有分页功能(尝试添加大量元素!)您仍然可以从项目视图一次将许多资产拖到列表中—只需将它们拖到列表本…

    2022年7月21日
  • p6使用说明_人员配置情况说明

    p6使用说明_人员配置情况说明P6SPY 是一个监控JDBC执行语句的开源产品,利用P6SPY很容易的就能监控到JDBC中执行的SQL语句,便于系统调试和性能调优。P6SPY 实现原理是对JDBC的关键类进行了一次包装,让应用系统调用自己的类;自己的类截获到SQL语句后再调用真实的JDBC驱动进行执行SQL,这样,在自己的类里面就可以监控到所有的SQL语句。    P6SPY 使用非常简单,只需要简单的几步即完成配置:

    2022年10月5日
  • 介绍6款热门的SpringCloud微服务开源项目,总有适合你的!

    点击上方“全栈程序员社区”,星标公众号 重磅干货,第一时间送达 今天介绍六款比较热门的SpringCloud微服务项目,感兴趣的可以clone下来研究一下,相信对你学习微服务架构很…

    2021年6月28日
  • webstorm 插件_vscode插件开发文档

    webstorm 插件_vscode插件开发文档webstorm集成了很多强大的前端插件。使用的时候只需要在webstorm中搜索plugin就可以出来一堆,选择需要的安装j

    2022年9月10日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号