zoukankan      html  css  js  c++  java
  • 动态规划 —— 背包问题一 专项研究学习

    背包问题OJ地址:http://oj.noi.cn/oj/#main/show/1159

    1159. 背包问题一 (Standard IO)

    时间限制1000 ms  空间限制: 262144 KB  具体限制  

    题目描述

    有个背包可承受重量N,现有T件物品
    每件物品重量为Wi,价值为Vi ,每件物品只有一个,这个背包可以装载物品的最大价值是多少?

    输入

    一行,N T 之间用空格隔开。
    后面t行,每行:重量Wi,价值Vi。

    输出

    这个背包可以装载物品的最大价值。

    样例输入

    100 5

    77 92

    22 22

    29 87

    50 46

    99 90

    样例输出

    133

    数据范围限制

    N<=1000,T<=100,1<=Wi,Vi<=100

    /*
    问题:
    有个背包可承受重量N,现有T件物品.
    每件物品重量为Wi,价值为Vi.
    每件物品只有一个.
    这个背包可以装载物品的最大价值是多少?
    */
    #include <iostream>
    #include <cstdio>
    using namespace std;
    //定义三个数组, W为不同物体的 重量,V为不同物体的价值,F为不同称量背包的总价值; 
    int W[2005],V[2005],F[2005];
    int main()
    {
        /*-------定义变量并读入数据------------*/
        int N,T;
        scanf("%d %d",&N,&T);
        for(int i=1;i<=T;i++)
            scanf("%d %d",&W[i],&V[i]);
        /*--------------动态规划----------------*/
        for(int i=1;i<=T;i++)//遍历每一件物品 
            for(int j=N;j>=W[i];j--)//不断地尝试 放置每一件物品 
            {
                F[j]=max(F[j-W[i]]+V[i],F[j]);//状态转移方程: F[j]=max(F[j-W[i]]+V[i],F[j])   刷新最大背包的当前最大价值; 
                /*详细分析此处:
                这里使用了动态规划算法,其实也就是记忆化搜索,
                就是把F【】中没搜一次都记录在F这个数组中,
                以后再次递归或递推时,就不需要 再次的计算,
                直接从数组中查询是否存在,如果存在,直接调用即可; 
                */
            }
        /*----------------输出解答-------------*/
        cout<<F[N]<<endl;
        return 0;    
    } //PS:2017年10月2日19:02:02 
  • 相关阅读:
    第三章 运算符与表达式
    python 第二章 对象与类型
    线段树区间染色+注意事项
    ACM-ICPC北京赛区2018重现赛 A题
    删除元组
    修改元组
    访问元组
    Python 元组
    Python List sort()方法
    hdu4501——小明系列故事——买年货(多维背包)
  • 原文地址:https://www.cnblogs.com/akenderman/p/7622092.html
Copyright © 2011-2022 走看看