动态规划-小强的暑假做业务

题目

临近开学了,大家都忙着收拾行李准备返校,但小强却不为此担心! 因为他的心思全在暑假作业上:目前为止还未开动(-_-!!还以为他有多冷静呢)。

暑假作业是很多张试卷,我们这些从试卷里爬出来的人都知道,卷子上的题目有选择题、填空题、简答题、证明题等。而做选择题的好处就在于工作量很少,但又因为选择题题目都普遍很长。 如果有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];
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值