牛能和牛可乐的礼物 题解

牛能和牛可乐的礼物

https://www.nowcoder.com/questionTerminal/6c5c3a9901ec4a90aa140348243da4e8

最优解:
看到这种题目描述,想到要就是变形的01背包问题,只不过体积和价值都是题目中给的“礼物价值”。
只要能想到这里,就可以想到把总体积的一半作为背包容量。01背包跑一下,得出的结果就是其中一个人拿到的礼物的总价值sum,然后另一个人得到的价值就是总价值减去sum,二者相减就是答案~
众所周知,背包的时间复杂度是物品个数x容积,空间复杂度是容积

#include <iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
using namespace std;
int price[50500],f[50500],n,t,sum;
int dp()
{
     memset(f,0,sizeof(f));
     for(int i=1;i<=n;i++)
     {
          for(int j=sum;j>=price[i];j--)
          {
               if(f[j]<f[j-price[i]]+price[i])
               f[j]=f[j-price[i]]+price[i];
          }
     }
     return f[sum];
}
int main()
{
   // freopen("cin.txt","r",stdin);
    while(~scanf("%d",&n))
    {
               sum=0;
               for(int i=1;i<=n;i++)
               {
                    scanf("%d",&price[i]);
                    sum+=price[i];
               }
               int cnt=sum;
               sum=(sum+1)/2;
               cnt=dp()*2-cnt;
               if(cnt<0) cnt=-cnt;
               printf("%d\n",cnt);
    }
    return 0;
}

。。。。。。
写完题解才发现录题的格式选错了 QAQ
按着最小的改动 改了一下

class Solution {
public:
    /**
     *
     * @param n int整型 送来礼物的总个数
     * @param presentVec int整型vector 每个礼物的价值
     * @return int整型
     */
    int maxPresent(vector<int>& presentVec) {
        // write code here
        int n = presentVec.size();
        int f[10500];
         memset(f,0,sizeof(f));
        int sum = 0;
        for(int i = 0; i < n; i ++)
        {
            sum += presentVec[i];
        }
        int cnt = sum;
        sum = (sum+1)/2;
         for(int i = 0; i < n; i++)
         {
              for(int j = sum; j >= presentVec[i]; j --)
              {
                   if(f[j] < f[j-presentVec[i]] + presentVec[i])
                           f[j] = f[j - presentVec[i]] + presentVec[i];
              }
         }
         cnt = f[sum] * 2 - cnt;
        if(cnt < 0)
            cnt =- cnt;
        return cnt;
    }
};

下面这样写会好一些

class Solution {
public:
    /**
     *
     * @param presentVec int整型vector 每个礼物的价值
     * @return int整型
     */
    int maxPresent(vector<int>& presentVec) {
        // write code here
        int sum=accumulate(presentVec.begin(),presentVec.end(),0);
        vector<int>dp(sum/2+1);
        for(int i=0;i<presentVec.size();i++)
            for(int j=sum/2;j>=presentVec[i];j--)
                dp[j]=max(dp[j],dp[j-presentVec[i]]+presentVec[i]);
        return sum-2*dp[sum/2];
    }
};

。。。。。。
普通解:
非要说的话,就是二进制枚举遍历一下,那么时间复杂度是图片说明
很明显,这种方法又费时间,数据范围还不能太大。这段代码就不改了
反正也只能过一部分的数据
唯一的优点是空间复杂度低

#include <iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
using namespace std;
int price[50500],f[50500],n,t,sum;
int dp()
{
     memset(f,0,sizeof(f));
     for(int i=1;i<=n;i++)
     {
          for(int j=sum;j>=price[i];j--)
          {
               if(f[j]<f[j-price[i]]+price[i])
               f[j]=f[j-price[i]]+price[i];
          }
     }
     return f[sum];
}
int main()
{
   // freopen("cin.txt","r",stdin);
    while(~scanf("%d", &n))
    {
               sum=0;
               for(int i = 0; i < n; i ++)
               {
                    scanf("%d", &price[i]);
                    sum += price[i];
               }
               int ans = sum;
               for (int i = 0; i < (1 << n); i ++) {
                    int tot = 0;
                    for (int j = 0; j < n; j ++) {
                        if (i & (1 << j )) {
                            tot += price[j];
                        }
                    }
                    if (ans > abs(tot * 2 - sum)) {
                        ans = abs(tot * 2 - sum);
                    }
               }
               printf("%d\n", ans);
    }
    return 0;
}

全部评论

相关推荐

01-08 12:01
门头沟学院 Java
冰炸橙汁_不做oj版:不接好运
点赞 评论 收藏
分享
今天提了离职,领导说让我离职前请几位正式工吃饭……我本来是有请客的打算的,因为感觉这几个同事人还挺好,想以后维持一下关系。但我第一次听领导主动说让实习生请客的……(只因为一个请客,倒不至于发个帖子。主要是这个公司的离谱事情太多了,跟之前的实习感受完全不同)之前几段实习,在实习结束前,mentor或领导会请客欢送,无论是私下吃个便饭也好,还是全部门的奶茶也好。这几位正式工既不是我的mentor,也不是我的领导。而且我异地实习生活很拮据,这家公司给得很少。当然了,这也算意料之外,情理之中。这家公司一直对实习生很不友好。经常让实习生加班,总是跟实习生说“辛苦一下”。你也没给我那个辛苦钱啊!晚上干到12点,周末加班干,要么是领导要看,要么是客户着急。之前的公司,我主动加班,mentor都会跟我说,实习生不用加班,到点下班就行。加班就算了,我安慰自己就当学东西了,锻炼抗压能力。但辛苦完了,节日的福利,竟然只有正式员工才有?!我之前实习,实习生的节日福利一点也不比正式工少啊……有的正式工还会把福利分给实习生一部分。挺心寒的……而且,我觉得这家公司对实习生很不负责,纯拿你当廉价劳动力。可以让刚毕业才工作三个月的人带实习生,实习生不会的,正式员工也不会,俩人就一起探索。还真就那个“和公司共同成长”😅避雷某GJ级专精特新小巨人企业,六百多人,整体氛围挺离谱的,跟我去过的其他公司完全不一样。领导都是些老东西,喜欢PUA,爹味十足。流程混乱、管理混乱、代码混乱、职责混乱,技术领导不懂技术,总说出一些可笑的畅想。虽然技术不咋地,但是把产品技术路线吹上天的本事倒是有,而且很大!什么xx系统、xx模型、xx工具,名字一个比一个高大上,其实可能就是调用Qwen、DeepSeek、Doubao……还声称这两年要上市,我祝你们成功吧😄
不知道怎么取名字_:实习的能有多少钱,为啥要请客
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务