您的位置:首页 > 其它

dp问题:采药

2015-10-24 16:31 274 查看
 今天把采药A了,属于dp问题,主要思路是把所有时间都存进一个数组中,数组的值对应药的价值,下标是时间,然后记忆化搜索,碰到价值高的就赋值,相比于摘花生,辰辰是一个聪明的猴子,不废话了,上代码。Code:#include <iostream>#include <cstring>using namespace std;int ji[1002];int main()  {         int t,m,a,b,i,j;         while(cin>>t>>m)    {                   memset(ji,0,sizeof(ji));                   for(i=1;i<=m;i++)                   {                            cin>>a>>b;                            if(t-a>=0)            for(j=t-a;j>=0;j--)             if(ji[j]+b>ji[j+a])               ji[j+a]=ji[j]+b;        }                   cout<<ji[t]<<endl;         }         return 0; }附带另一个问题,多多摘花生,这里不吐槽那猴子有多笨了,下面的数据足以说明;2   8  86  0  0  0  0  0  0  00         0  0  0  0  0  0  8那只猴子如果聪明的话能摘14个,笨蛋猴子只能摘8个。Code:#include <iostream>#include <cstdlib>using namespace std;int main(){        int n;        int row, col;        int time;        cin >> n;        while (n--)        {               cin >> row >> col >> time;               int i, j;               int curPi = 0, curPj;               int p[51][51];               int timet = 0;               int pg = 0;               for (i = 1; i <= row; i++)               {                       for (j = 1; j <= col; j++)                       {                               cin >> p[j];                       }               }               int maxPi = 0, maxPj = 0;               while (timet <= time)               {                        int max = 0;                       for (i = 1; i <= row; i++)                       {                               for (j = 1; j <= col; j++)                               {                                      if (p[j] > max)                                      {                                              max = p[j];                                              maxPi = i;                                              maxPj = j;                                      }                               }                        }                       if (max == 0)                               break;                       if (curPi == 0)                               curPj = maxPj;                       if (timet +                               (abs(maxPj - curPj) + abs(maxPi - curPi) + 1 + maxPi) <= time)                       {                               timet = timet + abs(maxPj - curPj) + abs(maxPi - curPi) + 1;                               curPi = maxPi;                               curPj = maxPj;                               pg += p[curPi][curPj];                               p[curPi][curPj] = 0;                       }                       else                               break;               }               cout << pg << endl;        }        return 0; }代码还老长。。。。。 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: