hdu 4091 Zombie’s Treasure Chest 貪心+枚舉

來源:互聯網
上載者:User

標籤:style   blog   http   color   io   os   ar   for   sp   

轉自:http://blog.csdn.net/a601025382s/article/details/12308193

題意:

輸入背包體積n,綠寶石體積s1,價值v1,藍寶石體積s2,價值v2,寶石數目無限,問背包裡能放下的最大價值?

題解:

看過去很像完全背包,可資料很大(雖然沒給出,也能猜到,不然太水了),所以不能用背包求。又只有兩種物品,想到了貪心,將價值與體積比大(稱為價值比)的優先放入。但體積限制,這樣還不可以,還需要枚舉減少價值比大的寶石個數,是否可以增大所求價值。又我們可以知道對於體積是m=lcm(s1,s2)背包,肯定全選價值比大的。所以至多隻要枚舉n-n/m+m的體積。如果小於這個值,存在大於m的空餘,這個空餘肯定用價值大的放置。

注意:

1.不夠一個公倍數的時候,計算需要小心。。我就出錯了。。

2.枚舉的時候,跨度選擇max(s1,s2),這個算是最佳化吧,沒有的話會TLE

 

 

  1 #include<iostream>  2 #include<cstring>  3 #include<cstdlib>  4 #include<cstdio>  5 #include<algorithm>  6 #include<cmath>  7 #include<queue>  8 #include<map>  9 #include<set> 10 #include<string> 11 //#include<pair> 12  13 #define N 10000005 14 #define M 1005 15 #define mod 1000000007 16 //#define p 10000007 17 #define inf 0x3f3f3f3f 18 #define mod2 100000000 19 #define ll long long 20 #define LL long long 21 #define maxi(a,b) (a)>(b)? (a) : (b) 22 #define mini(a,b) (a)<(b)? (a) : (b) 23  24 using namespace std; 25  26 ll n,s1,v1,s2,v2; 27 ll ans; 28 ll ma; 29 ll g; 30 ll c1,c2; 31 ll ans1,ans2; 32  33 ll gcd(ll a,ll b) 34 { 35     return b==0?a:gcd(b,a%b); 36 } 37 ll lcm(ll a,ll b) 38 { 39     return a/gcd(a,b)*b; 40 } 41  42 void ini() 43 { 44     ans=0; 45     ans1=ans2=0; 46     scanf("%I64d%I64d%I64d%I64d%I64d",&n,&s1,&v1,&s2,&v2); 47     g=lcm(s1,s2); 48     c1=g/s1; 49     c2=g/s2; 50 } 51  52  53  54 void solve() 55 { 56     if(n/g>=1) 57         ans1=(n/g-1)*max(c1*v1,c2*v2); 58     ll i; 59     if(s1<s2){ 60         swap(c1,c2); 61         swap(s1,s2); 62         swap(v1,v2); 63     } 64     ll left=n%g; 65     if(n/g>=1) 66         left+=g; 67     ll en=left/s1; 68     ll re; 69     for(i=0;i<=en;i++){ 70         re=i*v1+(left-i*s1)/s2*v2; 71         ans2=max(ans2,re); 72     } 73     ans=ans1+ans2; 74 } 75  76 void out() 77 { 78     printf("%I64d\n",ans); 79 } 80  81 int main() 82 { 83     int T; 84     //freopen("data.in","r",stdin); 85     //freopen("data.out","w",stdout); 86     scanf("%d",&T); 87     for(int ccnt=1;ccnt<=T;ccnt++) 88    // while(T--) 89    // while(scanf("")) 90     { 91         //if(n==0 && k==0 ) break; 92  93         ini(); 94         solve(); 95         printf("Case #%d: ",ccnt); 96         out(); 97     } 98  99     return 0;100 }

 

hdu 4091 Zombie’s Treasure Chest 貪心+枚舉

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.