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.pswp.cn/news/273395.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/273395.shtml
英文地址,請注明出處:http://en.pswp.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.用戶自…