练习3-Q

原创 2016年05月31日 11:01:54

题目:Problem Q

Problem Description
Many years ago , in Teddy’s hometown there was a man who was called “Bone Collector”. This man like to collect varies of bones , such as dog’s , cow’s , also he went to the grave …<br>The bone collector had a big bag with a volume of V ,and along his trip of collecting there are a lot of bones , obviously , different bone has different value and different volume, now given the each bone’s value along his trip , can you calculate out the maximum of the total value the bone collector can get ?<br><center><img src=../../../data/images/C154-1003-1.jpg> </center><br>

Input
The first line contain a integer T , the number of cases.<br>Followed by T cases , each case three lines , the first line contain two integer N , V, (N <= 1000 , V <= 1000 )representing the number of bones and the volume of his bag. And the second line contain N integers representing the value of each bone. The third line contain N integers representing the volume of each bone.

Output
One integer per line representing the maximum of the total value (this number will be less than 2<sup>31</sup>).

Sample Input
1 5 10 1 2 3 4 5 5 4 3 2 1

Sample Output
14

题意:

01背包问题,往体积为V的背包里放体积和价值不同的东西,求背包被放满时的最大价值;

思路:

只考虑第i件物品放或不放,如果第i件物品可以放得开,则其动态转移方程为
dp[i][j] = max(dp[i-1][j], dp[i-1][j-vo[i]]+va[i]);
其中i表示第i件物品,j表示放入第i件物品后的体积。

代码:

# include <iostream>
# include <string.h>
# include <algorithm>

using namespace std;

int dp[1001][1001];



int main()
{
    int va[1001], vo[1001];
    int T;
    cin >> T;
    while(T--)
    {
        memset(va,0,sizeof(va));
        memset(vo,0,sizeof(vo));
        memset(dp,0,sizeof(dp));
        int N, V;
        cin >> N >> V;
        for(int i = 1;i <= N; i++)
            cin >> va[i];
        for(int i = 1;i <= N; i++)
            cin >> vo[i];


        for(int i = 1;i <= N; i++)
        {
            for(int j = 0;j <= V; j++)
            {
                if(vo[i] <= j)
                    dp[i][j] = max(dp[i-1][j], dp[i-1][j-vo[i]]+va[i]);
                else
                    dp[i][j] =dp[i-1][j];
            }
        }

        /*for(int i = 1;i <= N; i++)
        {
            for(int j = 0;j <= V; j++)
                cout << dp[i][j] << " ";
            cout << endl;
        }*/
            cout << dp[N][V]<<endl;
    }

    return 0;
}


vim练习

学习 vim 并且其会成为你最后一个使用的文本编辑器。没有比这个更好的文本编辑器了,非常地难学,但是却不可思议地好用。 我建议下面这四个步骤: 存活感觉良好觉得更好,更强,更快使用VIM的超能...
  • baiquan17
  • baiquan17
  • 2017年04月07日 11:57
  • 429

linux 各命令字练习

linux 各命令字练习
  • lile777
  • lile777
  • 2016年09月14日 17:48
  • 1953

练习学习Linq和Lambda

1、 查询Student表中的所有记录的Sname、Ssex和Class列。 select sname,ssex,class from student Linq:     from s in S...
  • make1828
  • make1828
  • 2014年07月23日 14:08
  • 663

css3 html5 3D动画练习

New Document div{ margin-bottom:10px; width:200px; height:100px; } @keyframes myfirst { from {bac...
  • zhaoqingkaitt
  • zhaoqingkaitt
  • 2015年01月10日 10:46
  • 1138

Android基础练习

1.自定义Toast 步骤,首先需要添加一个自定义的toast布局,然后通过构造方法实例化一个Toast对象即可 public void onToast(View view) { ...
  • u011337769
  • u011337769
  • 2017年06月08日 19:49
  • 310

oracle百例训练

 Oracle系列《一》:简单SQL与单行函数     使用s   cott/tiger用户下的emp表和dept表完成下列练习,表的结构说明如下 emp员...
  • u010098159
  • u010098159
  • 2016年03月24日 18:23
  • 1257

HTML练习-1

http://7xrp04.com1.z0.glb.clouddn.com/task_1_1_1.jpg 代码:   第一部分的          p{ margin: 0px; paddi...
  • itzhengmaolin
  • itzhengmaolin
  • 2016年08月01日 19:44
  • 349

shell脚本练习(三)

1.模拟linnux登录shell#/bin/bash echo -n "login:" read name echo -n "password:" read passwd if [ $name =...
  • u011915230
  • u011915230
  • 2016年07月20日 15:20
  • 2034

Java Web学习(8):阶段小项目练习

一输出圆的信息        项目描述:编写一个JSP页面中声明圆的半径和计算方法,然后使用表达式,实现输出圆的半径,直径,面积和 周长的相关信息。        JSP实现代码: ...
  • erlian1992
  • erlian1992
  • 2016年07月12日 13:39
  • 3102

h5学习笔记: css布局案例练习

今天练习一下css相关的布局,没有写交互内容。在css布局中,发现也不少不熟悉的地方。只是没有形成概念,其次对一些用法比较模糊。日后需要加强一下这些。对平衡的两个div应该如何处理,还要继续想想办法。...
  • hero82748274
  • hero82748274
  • 2016年08月22日 21:55
  • 2346
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:练习3-Q
举报原因:
原因补充:

(最多只允许输入30个字)