DP 一直是心中痛,不多说了,这个暑假就坑在这上了。

这暑假第一道DP题,01背包问题。

题意是说物品有 重量和价值 ,但你能承受的重量有限,问你能带的最大价值。

这题数组开大点,尽管不知道有啥坑点,可是我数组开得大,直接1A了。

想想自己DP都是大问题,还要给学弟讲(tiao)题(jiao),真是忧伤。

仅仅能这几天通宵点出 DP 天赋。顺便贴上自己的理解,反正我也准备这样给学弟讲,假设有误,请路过大神指正。

论01背包的自我修养:

N个物品,M容量的包,最大价值为W。
        
        第 i 件物品分别有 Vi 的重量和 Ci 的价值。

N = 4 ,M= 6 。

V        C
            
        1:    1        4
        2:    2        6
        3:    3        12
        4:    2        7
        
        int dp[10001],c[10001],v[10001];
        
        //分别为背包的价值,物品的价值,物品重量。
        
        memset(dp,0,sizeof(dp));

//初始化背包    毕竟没放东西的时候是没有价值的

//还有其它初始化为-INF 的情况,仅仅有dp[0]=0。这是要求:恰好装满的最大价值。

for ( int i = 0 ;  i < n  ; i++)
        {
            //从第一件物品開始放
            
            for ( int j = m ; j-v [i] >= 0 ; j--)    // j - v[i] >=0防止数组越界,毕竟背包容量不能为负
            {
                //背包每次减去1,看能不能放进去这件物品
                
                //printf("%d:max(%d,%d) ",j,dp[j],dp[j-c[i]]+v[i]);
                
                dp[j] = max ( dp[j] , dp[ j-v[i] ] + c[i] );
            
                //当背包容量为j的时候,能放进去添加价值,就放进去
                
                //dp[j] 容量为j的时候的价值
                
                //dp[ j-c[i] ] + c [i]  (容量j减去当前物品的重量=剩余容量) 的价值 + 当前物品的价值
                
                //价值当然越大越好 取max
                
                //当 j - v[i] < 0表明背包已经不能放了。
            }
            
        }
        
        容量:max(前一个价值,放入当前物品后的价值)
        
        6 :max(0,4)         5 :max(0,4)         4 :max(0,4)         3 :max(0,4)         2 :max(0,4)         1 :max(0,4)
        6 :max(4,10)       5 :max(4,10)       4 :max(4,10)       3 :max(4,10)       2 :max(4,6)
        6 :max(10,22)     5 :max(10,18)     4 :max(10,16)     3 :max(10,12)
        6 :max(22,23)     5 :max(18,19)     4 :max(16,13)     3 :max(12,11)     2 :max(6,7)
        
        
        最后背包 从容量 0 ~ 6 所能有的价值,取其最大值。

M:W      0        1        2        3          4         5          6

0:0     1:4     2:7     3:12     4:16     5:19     6:23
                
        
        这时候背包装满的情况 价值W最大,为23。

#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<queue>
#include<map>
#include<stack>
#include<iostream>
#include<list>
#include<set>
#include<cmath>
#define INF 0x7fffffff
#define eps 1e-6
using namespace std;
int dp[1000001];
int c[100001],v[100001];
int n,m;int main()
{while(scanf("%d%d",&n,&m)!=EOF){for(int i=0;i<n;i++)scanf("%d%d",&c[i],&v[i]);memset(dp,0,sizeof(dp));for(int i=0;i<n;i++){for(int j=m;j-c[i]>=0;j--){dp[j]=max(dp[j],dp[j-c[i]]+v[i]);}}int ans=0;for(int i=0;i<=m;i++)ans=max(ans,dp[i]);printf("%d\n",ans);}
}

POJ 3624 Charm Bracelet相关推荐

  1. POJ 3624 Charm Bracelet 0-1背包

    传送门:http://poj.org/problem?id=3624 题目大意:XXX去珠宝店,她需要N件首饰,能带的首饰总重量不超过M,要求不超过M的情况下,使首饰的魔力值(D)最大. 0-1背包入 ...

  2. POJ - 3624 Charm Bracelet

    题目链接:http://poj.org/problem?id=3624 题意:一共给出n种手镯,每个手镯有着各自的重量以及魅力值,在m重量下能得到的最大魅力值是多少. 分析:标准的01背包.状态转移如 ...

  3. poj 3624 Charm Bracelet (01背包)

    题目链接:http://poj.org/problem?id=3624 //典型01背包问题 //状态转移方程dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+d[i]) ...

  4. POJ 3624 Charm Bracelet(01背包 基础)

    题意: n个装饰品 容量m的背包 每个装饰品 重wi 价值 di 求能装的最大价值 思路:基础01背包 #include<stdio.h> #include<string.h> ...

  5. 【POJ - 3624 】Charm Bracelet (dp,0-1背包裸题)

    题干: Bessie has gone to the mall's jewelry store and spies a charm bracelet. Of course, she'd like to ...

  6. 我花了三个小时写了一道题的六千字题解....(POJ 2888 Magic Bracelet)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 前置知识:小学生都能看懂的群论从入门到升天教程 <群论全家桶> 一道简单的题目 Probl ...

  7. AC日记——[USACO07DEC]手链Charm Bracelet 洛谷 P2871

    题目描述 Bessie has gone to the mall's jewelry store and spies a charm bracelet. Of course, she'd like t ...

  8. Charm Bracelet(0-1)

    Bessie has gone to the mall's jewelry store and spies a charm bracelet. Of course, she'd like to fil ...

  9. Charm Bracelet

    Bessie has gone to the mall's jewelry store and spies a charm bracelet. Of course, she'd like to fil ...

最新文章

  1. unigui的页面布局使用
  2. npm i和npm_让您的NPM套件包含Jest和Codecov☂️
  3. “傻子”阿甘的大智慧
  4. x5内核有什么优点_欧尚X5国产又一黑马SUV,颜值高性能强,顶配仅需10万左右
  5. win7下不能使用dnw烧写的解决办法——韦东山嵌入式Linux学习笔记05
  6. GFS分布式文件系统简介及部署——让存储变得更高级
  7. MMKV集成与原理,先收藏了
  8. 找一个程序员当男朋友是什么样的体验?
  9. Cisco IOS Unicast NAT 工作原理 [一]
  10. ExtJS,JQuery,Dojo的小比较
  11. Forward Plus Rendering
  12. java堆内存_java堆内存模型
  13. 一个非常经典的erp教程
  14. 人工智能白皮书(2022年)
  15. TheFatRat免杀
  16. 医学计算机思维培养方式的研究,计算机教学中的科研思维培养
  17. python locust学习笔记
  18. 中序遍历二叉树非递归
  19. Session.AUTO_ACKNOWLEDGE
  20. [wayfarer]PetShop数据访问层之数据库访问设计

热门文章

  1. 前端预览word文件_2020国开形考计算机练习题Word练习
  2. 5G NR基础参数及帧结构
  3. Spring 运用 pointcut 和 advisor 对特定的方法进行切面编程
  4. linux 查看文件和文件夹大小
  5. Index of sql server
  6. HDU 6175 算术
  7. 【转】Linux系统安装Redis详细过程
  8. ThreadPoolExecuotor源码参考
  9. Vue axios发送Http请求
  10. 【备忘录】创建数字数组