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; }代码还老长。。。。。