题目链接:http://noi.openjudge.cn/ch0206/1775/
如果你是辰辰,你能完成这个任务吗?
输入输入的第一行有两个整数T(1 <= T <= 1000)和M(1 <= M <= 100),T代表总共能够用来采药的时间,M代表山洞里的草药的数目。接下来的M行每行包括两个在1到100之间(包括1和100)的的整数,分别表示采摘某株草药的时间和这株草药的价值。输出输出只包括一行,这一行只包含一个整数,表示在规定的时间内,可以采到的草药的最大总价值。样例输入
70 3 71 100 69 1 1 2样例输出
3
简单的dp(超)对于每个
ac:
#include<stdio.h> #include<string.h> #include<math.h> //#include<map> #include<set> #include<deque> #include<queue> #include<stack> #include<string> #include<iostream> #include<algorithm> using namespace std; #define ll long long #define da 0x3f3f3f3f #define xiao -0x3f3f3f3f #define clean(a,b) memset(a,b,sizeof(a))// 雷打不动的头文件 int dp[110][1100]; int ti[110],v[110]; int t,m; int maxx(int a,int b) { return a>b?a:b; } int main() { cin>>t>>m; int i,j; for(i=0;i<m;++i) cin>>ti[i]>>v[i]; for(i=0;i<m;++i) { for(j=1;j<=t;++j) { if(ti[i]<=j)//时间够 看可不可以选择 dp[i+1][j]=maxx(dp[i][j-ti[i]]+v[i],dp[i][j]); else//不可以的继承上一个的状态 dp[i+1][j]=dp[i][j]; } } // for(i=0;i<=m;++i)//调试的代码 // { // for(j=0;j<=t;++j) // cout<<dp[i][j]<<" "; // cout<<endl; // } cout<<dp[m][t]<<endl; }