合肥工業大學 OnlineJudge——1002 B-黑石部落(動態規划)


B-黑石部落

Time Limit: 1000 MS Memory Limit: 65536 KB
Total Submissions: 1196 Accepted: 303

Description


    20分鍾后,在烏瑟爾營地附近的黑石部落內,烏瑟爾派出了談判的騎士,但活着回來的卻只有騎士的馬匹。由於獸人仍不願意投降,烏瑟爾便將指揮權交給了阿爾薩斯,希望由他來組織對黑石獸人的進攻。
    阿爾薩斯需要訓練自己的部隊來對抗獸人。他可以訓練的部隊有K(K<10)種,第i種部隊的一個單位需要消耗G[i]的黃金,而這個部隊的戰斗力是W[i]。現在阿爾薩斯有一座儲量為N(N<15000)的金礦,那么他能訓練出的最大戰斗力是多少呢?

Input


輸入包括多組數據,每組數據的第一行是兩個正整數N,K。接下來有K行,每行兩個正整數,分別是G[i]與W[i]。輸入以文件結尾結束。

Output


每行一個數,表示該組數據下阿爾薩斯能訓練出的最大戰斗力。

Sample Input


10 2
6 12
4 9

Sample Output


21

Source


Gardon & Gondar

想了想就是普通的動態規划,從假設只有1黃金開始找最優解,一開始i只允許訓練一個單位的時候可以看做0戰斗力+訓練單位的戰斗力,此時可訓練單位戰斗力的最大值就是最大戰斗力。保證開始是最優解后,之后的問題可以拆分成已知訓練此單位之前的最大戰斗力,判斷訓練此單位后是否還是最大戰斗力,直到黃金達到N為止。把每種黃金數量能得到的最大的戰斗力都存儲在數組里面,方便后面進行比較。

AC代碼:

[cpp]  view plain  copy
  1. #include<iostream>  
  2. #include<algorithm>  
  3. using namespace std;  
  4.   
  5. //代表部隊,g表示訓練一個單位需要消耗的黃金,w表示這個單位的戰斗力   
  6. struct BD {  
  7.     int g,w;  
  8. };  
  9.   
  10. //用於將軍隊按消耗黃金從小到大排序   
  11. bool cmp(BD a, BD b) {  
  12.     return a.g<b.g;  
  13. }  
  14.   
  15. int main(void) {  
  16.     int n,k;  
  17.     while(cin>>n>>k) {  
  18.         BD bd[10];  
  19.         for(int i=0; i<k; i++) {  
  20.             cin>>bd[i].g>>bd[i].w;  
  21.         }  
  22.         //排序   
  23.         sort(bd,bd+k,cmp);  
  24.         //初始化為0   
  25.         int dp[15001]= {};  
  26.         for(int i=1; i<=n; i++) {  
  27.             for(int j=0;j<k;j++){  
  28.                 //如果黃金足夠訓練這個單位   
  29.                 if(i-bd[j].g >= 0){  
  30.                     //如果將i-bd[j].g黃金訓練得到的最大戰斗力  
  31.                     //加上訓練此單位的戰斗力超過了之前計算的最大戰斗力  
  32.                     if(dp[i] < bd[j].w+dp[i-bd[j].g]){  
  33.                         dp[i] = bd[j].w+dp[i-bd[j].g];  
  34.                     }  
  35.                 }  
  36.             }  
  37.         }   
  38.         sort(dp,dp+n+1);  
  39.         //輸出最大值   
  40.         cout<<dp[n]<<endl;  
  41.     }  
  42. }  

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com