题目
临近开学了,大家都忙着收拾行李准备返校,但小强却不为此担心! 因为他的心思全在暑假作业上:目前为止还未开动(-_-!!还以为他有多冷静呢)。
暑假作业是很多张试卷,我们这些从试卷里爬出来的人都知道,卷子上的题目有选择题、填空题、简答题、证明题等。而做选择题的好处就在于工作量很少,但又因为选择题题目都普遍很长。 如果有5张试卷,其中4张是选择题,最后一张是填空题,很明显做最后一张所花的时间要比前4张长很多。但如果你只做了选择题,虽然工作量很少,但表面上看起来也已经做了4/5的作业了。 小强决定就用这样的方法来蒙混过关。
他统计出了做完每一张试卷所需的时间以及它做完后能得到的价值(按上面的原理,选择题越多价值当然就越高咯)。现在就请你帮他安排一下,用他仅剩的一点时间来做最有价值的作业。
注意点:只统计整数值
思路:典型的01背包问题
int t[] = {2,3,6,3,4};
int v[] = {1,2,4,4,6};
vector<int> time_arr(t, t+sizeof(t)/sizeof(t[0])-1);
vector<int> value_arr(v, v+sizeof(v)/sizeof(v[0])-1);
int maxValue(int left_time)
{
int num = time_arr.size();
//创建二维数组,行num+1, 列left_time+1
vector<vector<int> > dp(num+1, vector<int>(left_time+1, 0));
int i=1, j=1;
for(i=1; i<num+1; i++)
{
for(j=1; j<left_time+1; j++)
{
//如果第i个作业的时间超过当前的j,那么根本做不完,当前j对应的最大价值还是上一次的
if(time_arr[i-1] > j)
{
dp[i][j] = dp[i-1][j];
}
else
{
//否则,在这个时间内可以完成第i分作业,那么就要考虑当前如果做第i分作业可以取得的最大值,然后和不做第i份作业的最大值比较;
//不做第i分作业的最大值是dp[i-1][j]
//做第i份作业的最大值是dp[i-1][j-time[i]] + value_arr[i]; 这里的意思是做作业i,那么需要为其预留time[i]的空间,那么做作业i的最大值,即作业i的价值 + 当时间为j-time[i]时可以完成的最大价值
dp[i][j] = max(dp[i-1][j], dp[i-1][j-time_arr[i-1]]+value_arr[i-1]);
}
}
}
return dp[i-1][j-1];
}