hdu 4091 线性规划

分析转自:http://blog.csdn.net/dongdongzhang_/article/details/7955136

 

题意 :  背包能装体积为N,  有两种宝石, 数量无限, 不能切割。  分别为 size1   value 1 size2 value2

问背包能装最大的价值?


思路 : 线性规划问题。  有一组坑爹数据  100 3 3 7 7   一般的会输出 99     但是结果是 100  各10颗


线性规划知识, x, y 分别为 取两种宝石的数量   目标函数 : z = v1 * x + v 2 * y;      K = -(v1 / v2);

1.   x >= 0;

2.   y >= 0;

3.   s1 * x + s2 + y <= N;   k = - (s1 / s2);




若  abs(K)  > abs (k)  那么 将相交与B。   若abs(K) ==  abs(k)  整条直线都可以。 若 abs(K) < abs(k) 相交与A

其实   abs(K) = v1 / v2  >  abs(k) = s1 / s2   正好是 价值比的比较,   v1 / s1 > v2 / s2    ,v1价值大, 就应该  x  大些, 取1宝石多些。

同理  价值相同  就应该 x, y 取什么都可以,  v2 价值大, 就应该 y 大些,  取2宝石多些。


但是  宝石不能切割, 所以。 就形成了一个区域, 在最优解附近。 所以区域附近的点 需要枚举。

不过有一个不变的是, 在两宝石的体积的最小公倍数内, 肯定取价值大。

而在最小公倍外的,就要分别枚举。 不能盲目的取价值大。 

 比如一个例子,   20 4 5 6 8   答案是 26  = 2 * 5 + 2 * 8。  若只取价值大的, 会装不满。 没取到最优解。    

4 与 6 的最小公倍数是 12.  那每一个12的体积  就应该取  2个  宝石2   因为宝石2价值大。

剩余的8 就有取枚举, 0 * 5 + 1 * 6 , 或者  1 * 5 + 0 * 6,  或者 2 * 5 + 0 * 6   那么就取2个宝石1.  就能装满了, 并且价值最大。

但是 如果是 15 4 5 6 8 的话,  那么按照这方法就会输出   16   只能取到  2个 宝石2  剩余3体积, 不能取到任意宝石。 

答案应该是 18 = 2 * 5 + 1 * 8,   少取一个宝石2,腾出6体积,并 利用剩余的3体积的2体积 取两颗宝石1,价值更大。

所以,面对这问题。  我们就应该至少腾出一个公倍数的空间才枚举。  不然就会出错。

 1 #include<stdio.h>
 2 #include<algorithm>
 3 using namespace std;
 4 long long gcd(long long da,long long xiao)
 5 {
 6     long long temp;
 7     while(xiao!=0)
 8     {
 9         temp=da%xiao;
10         da=xiao;
11         xiao=temp;
12     }    
13     return da;
14 }    
15 int main()
16 {
17     int iCase=0;
18     int T;
19     scanf("%d",&T);
20     long long N,S1,V1,S2,V2;
21     while(T--)
22     {
23         iCase++;
24         scanf("%I64d%I64d%I64d%I64d%I64d",&N,&S1,&V1,&S2,&V2);
25         long long tmp=S1*S2/gcd(S1,S2);
26         long long res;
27         long long tt=N/tmp;
28         N=N%tmp;
29         if(tt)
30         {
31             tt--;
32             N+=tmp;
33         }    
34         res=max((tt)*(tmp/S1)*V1,(tt)*(tmp/S2)*V2);
35         long long res2=0;
36         if(S2>S1)
37         {
38             long long t;
39             t=S1;S1=S2;S2=t;
40             t=V1;V1=V2;V2=t;
41         }    
42         for(int i=0;i<=N/S1;i++)
43         {
44             if(res2<i*V1+(N-i*S1)/S2*V2)res2=i*V1+(N-i*S1)/S2*V2;
45         }    
46         res+=res2;
47         printf("Case #%d: %I64d\n",iCase,res);
48     }    
49     return 0;
50 }

 

转载于:https://www.cnblogs.com/cnblogs321114287/p/4286913.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273395.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux fmt命令

简单的格式化文本 fmt [option] [file-list] fmt通过将所有非空白行的长度设置为几乎相同&#xff0c;来进行简单的文本格式化 参数 fmt从file-list中读取文件&#xff0c;并将其内容的格式化版本发送到标准输出。如果不制定文件名或者用连字符&#xff08;-&#xff09;来替代…

基于 jQuery支持移动触摸设备的Lightbox插件

Swipebox是一款支持桌面、移动触摸手机和平板电脑的jquery Lightbox插件。该lightbox插件支持手机的触摸手势&#xff0c;支持桌面电脑的键盘导航&#xff0c;并且支持视频的播放。 在线预览 源码下载 简要教程 Swipebox是一款支持桌面、移动触摸手机和平板电脑的jQuery Ligh…

简化工作——我的bat文件

重启adb(radb.bat)&#xff1a; echo off call adb kill-server call adb start-server call adb remount push 一个apk(push.bat) echo off if "%1""launcher" ( call adb push 相关apk路径 system/app )else ( echo 请添加一个参数!当前有效…

js操作数据库

<script languagejavascript> function replace(v) { //容错问题&#xff0c;请读者自行进行判断。 //定义SQL语句 var sql select * from Dictionary where MainID v ; //新建数据库连接对象和数据集存取对象 var ConnDB new ActiveXObject(adodb.connection)…

Java中StringBuilder的清空方法比較

StringBuilder 没有提供clear或empty方法。清空有3种方法&#xff1a;1&#xff09;新生成一个&#xff0c;旧的由系统自己主动回收2&#xff09;使用delete3&#xff09;使用setLength 将三种方法循环1000万次&#xff0c;代码&#xff1a; 1.public class sbbm { 2. 3. st…

LinkCutTree 总结

最近学习了LinkCutTree&#xff0c;总结一下。 LinkCutTree是一种数据结构&#xff08;是Tree Decomposition中的一种&#xff09;&#xff0c;她维护的一般是无向图&#xff08;一个森林&#xff09;&#xff0c;支持连边、删边、链修改、链查询&#xff08;点属于特殊的链&am…

linux 数据转换

使用bc 可以进行不同进制之间的转换 digit100; printf "the number is : %d\n" $digit;binary$( echo "obase2;$digit" | bc );printf "result is : %s\n" $binary;digit1$( echo "obase10;ibase2;$binary" | bc );printf "bina…

PHP常用的正则表达式(有些需要调整)

平时做网站经常要用正则表达式&#xff0c;下面是一些讲解和例子&#xff0c;仅供大家参考和修改使用&#xff1a; "^\d$"  //非负整数&#xff08;正整数 0&#xff09; 顺平注: 验证输入id数值&#xff0c;不能为0 $reg1/^[1-9]\d*$/; "^[0-9]*[1-9][0-9]…

浮点数据的运算

使用bc设置scale可以进行相应的浮点运算#!/bin/bash# FileName TestBc.shdigit100;sqrt$(echo "scale3;sqrt($digit) " | bc);echo $sqrt;var$(echo "scale3;10/3" | bc);echo $var;var1$( echo "scale2;0.5*3" | bc);echo $var1;

IE(IE6/IE7/IE8)支持HTML5标签--20150216

让IE&#xff08;ie6/ie7/ie8&#xff09;支持HTML5元素&#xff0c;我们需要在HTML头部添加以下JavaScript&#xff0c;这是一个简单的document.createElement声明&#xff0c;利用条件注释针对IE来调用这个js文件。Opera&#xff0c;FireFox等其他非IE浏览器就会忽视这段代码…

linux shell 求绝对值

abs-1;printf "the number is : %d\n" $abs;printf "abs is : %d\n" $abs;if [ $abs -lt 0 ]; thenlet abs0-$abs;fiprintf "abs is : %d\n" $abs;

PyQt中从RAM新建QIcon对象 / Create a QIcon from binary data

一般&#xff0c;QIcon是通过png或ico等图标文件来初始化的&#xff0c;但是如果图标资源已经在内存里了&#xff0c;或者一个zip压缩文件内&#xff0c;可以通过QPixmap作为桥梁&#xff0c;转换为图标。 zf zipfile.ZipFile("library.zip") # 准备zip文件 pm …

Java中的代码块标记

taga: {for (int k 0; k < 5; k) {System.out.println("kkkkkk: " k);if (k > 3) {break taga;}tagb: for (int i 0; i < 10; i) {System.out.println("i: " i);if (i 2) {break tagb;}}}}

windows中安装zookeeper

Zookeeper 分布式服务框架是 Apache Hadoop 的一个子项目&#xff0c;它主要是用来解决分布式应用中经常遇到的一些数据管理问题&#xff0c;如&#xff1a;统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。本文将从使用者角度详细介绍 Zookeeper 的安装和配…

MySQL Event

一、前言自MySQL5.1.6起&#xff0c;增加了一个非常有特色的功能–事件调度器(Event Scheduler)&#xff0c;可以用做定时执行某些特定任务&#xff08;例如&#xff1a;删除记录、对数据进行汇总等等&#xff09;&#xff0c;来取代原先只能由操作系统的计划任务来执行的工作。…

Java中实现统计一个字符串在另一个字符串中出现的次数统计

public int getSubNum(String a,String b){int num0;String stra;int indexa.indexOf(b);while(index!-1){num;strstr.substring(indexb.length()-1);indexstr.indexOf(b);}return num;}

【编程练习】正整数分解为几个连续自然数之和

题目&#xff1a;输入一个正整数&#xff0c;若该数能用几个连续正整数之和表示&#xff0c;则输出所有可能的正整数序列。 一个正整数有可能可以被表示为n(n>2)个连续正整数之和&#xff0c;如&#xff1a; 1512345 15456 1578 有些数可以写成连续N&#xff08;>1&am…

IOS-C语言第12天,(函数指针)Point and macro(宏)

转载于:https://www.cnblogs.com/xiangrongsu/p/4309366.html

c# 两个数的加减乘除

Console.Title "加减乘除"; double x, y,z0; string m; int n0; Console.WriteLine("第一个数&#xff1a;"); x Convert.ToDouble(Console.ReadLine()); Console.WriteLine("运算符(默认为加)&#xff1a;"); m Console.ReadLine(); m (m &…

mysql建表语句

在sql语句中注意“约束的概念": 1.实体完整性约束(主键--唯一且非空) primary key()违约处理:No action(拒绝执行)2.参照完整性约束(外键约束)foregin key() references tableName(filedName) [on delete|update casecade | no action]违约处理:级联更新或拒绝执行3.用户自…