当前位置: 首页 > news >正文

php实现 称砝码(背包)

php实现 称砝码(背包)

一、总结

一句话总结:

 

1、dp的实质是什么?

刷表啊,用空间换时间

把表画出来会做得更快

13 //动态规划就是一个表
14 //至于这个表的更新就是上面层的表更新下面层的,是逐级更新还是跳级更新要注意
15 //把表画出来做的更快

 

2、dp的初始状态怎么得到(其实可以最开始想到的就是用所求做状态)?

其实可以最开始想到的就是用所求做状态

 4 //dp就是思考变量(然后变量组合成初始状态):变量有用几种砝码,每种砝码有多少个,重量为多少

 

3、dp的状态转移方程怎么得到?

用不同的初始状态去试

一维不行就加到二维,二维不行就加到3维

 

4、这里又忘记初始化中间数组了(在不同的组数据之间)?

26     $dp=null;
27     $dp[0]=1;

 

 

 

二、称砝码(背包)

题目描述

现有一组砝码,重量互不相等,分别为m1,m2,m3…mn;
每种砝码对应的数量为x1,x2,x3...xn。现在要用这些砝码去称物体的重量,问能称出多少中不同的重量。

 

注:

称重重量包括0

 

方法原型:public static int fama(int n, int[] weight, int[] nums)

 

输入描述:

输入包含多组测试数据。
对于每组测试数据:
第一行:n --- 砝码数(范围[1,10])
第二行:m1 m2 m3 ... mn --- 每个砝码的重量(范围[1,2000])
第三行:x1 x2 x3 .... xn --- 每个砝码的数量(范围[1,6])

输出描述:

利用给定的砝码可以称出的不同的重量数

示例1

输入

复制
2
1 2
2 1

输出

复制
5

 

代码:

 

 1 <?php
 2 //php本身是桶,所以这里用重量来做dp是可以的
 3 //初始状态  最终状态  状态转移方程
 4 //dp就是思考变量(然后变量组合成初始状态):变量有用几种砝码,每种砝码有多少个,重量为多少
 5 //f[i][j]表示用了第i种砝码用了j个所能达到的重量
 6 //dp方程为:f[i+1][]=f[i][j]+
 7 
 8 //f[i][j]表示前i种物品能否达到j重量
 9 //f[i][j]=(或者关系)第i件物品取0到n(i)件能够达到
10 //f[i-1][j]||(取)f[i-1][j]+k*wi[k 0->ni]
11 //f[i][j][k]表示前i种物品取j件能否达到k重量
12 
13 //动态规划就是一个表
14 //至于这个表的更新就是上面层的表更新下面层的,是逐级更新还是跳级更新要注意
15 //把表画出来做的更快
16 while($n=trim(fgets(STDIN))){
17     $w=trim(fgets(STDIN));
18     $num=trim(fgets(STDIN));
19     $w=explode(' ',$w);
20     $num=explode(' ',$num);
21     $total=10;
22     for($i=0;$i<$n;$i++){
23         $total+=$w[$i]*$num[$i];
24     }
25 
26     $dp=null;
27     $dp[0]=1;
28     for($i=1;$i<=$n;$i++){
29         for($j=$total;$j>=0;$j--){
30             for($k=0;$k<=$num[$i-1];$k++){
31                 if($j-$k*$w[$i-1]>=0&&$dp[$j-$k*$w[$i-1]]){
32                     $dp[$j]=1;
33                     break;
34                 } 
35             }
36         }
37     }
38     echo count($dp).PHP_EOL;
39     //print_r($w);
40     //print_r($num);
41 
42 }
43 ?>

 

 

 

 

 

相关文章:

  • Debian samba支持域用户登录
  • Centos7命令行下安装和配置Apache服务器
  • linux命令截取文件最后n行(所有命令)
  • python-模块与包
  • Java进阶02 异常处理
  • Kerberos+LDAP+NFSv4 实现单点登录
  • mysql 常用函数
  • SystemCenter2012SP1实践(5)SCVMM管理HyperV
  • 王永庆:技术创新改变教育未来
  • 文摘《十一》
  • 简单理解OAuth 2.0
  • iOS疑问
  • Spring Cloud云架构-SSO单点登录之OAuth2.0 根据token获取用户信息(4)
  • web.py开发web 第八章 Formalchemy 服务端验证
  • 邮件服务器postfix+dovecot+mysql
  • php的引用
  • codis proxy处理流程
  • CSS实用技巧
  • ERLANG 网工修炼笔记 ---- UDP
  • ES6 ...操作符
  • Java Agent 学习笔记
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • mysql_config not found
  • php面试题 汇集2
  • PHP那些事儿
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Spark RDD学习: aggregate函数
  • SQLServer之创建数据库快照
  • 对象引论
  • 回顾2016
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 前端相关框架总和
  • 入门级的git使用指北
  • 设计模式 开闭原则
  • 深入浅出webpack学习(1)--核心概念
  • 事件委托的小应用
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • ​如何防止网络攻击?
  • #Linux(make工具和makefile文件以及makefile语法)
  • (1) caustics\
  • (libusb) usb口自动刷新
  • (一)Neo4j下载安装以及初次使用
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .FileZilla的使用和主动模式被动模式介绍
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .NET Core 和 .NET Framework 中的 MEF2
  • .NetCore 如何动态路由
  • @NoArgsConstructor和@AllArgsConstructor,@Builder
  • @require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法
  • [ 云计算 | AWS ] AI 编程助手新势力 Amazon CodeWhisperer:优势功能及实用技巧
  • [BUUCTF]-Reverse:reverse3解析
  • [CUDA 学习笔记] CUDA kernel 的 grid_size 和 block_size 选择
  • [Godot] 3D拾取
  • [HNOI2006]鬼谷子的钱袋