Holding Bin-Laden Captive! (HDU-1085)

博客围绕一个数学问题展开,已知三种硬币(1角、2角、5角)的个数,求最小不能组成的钱数。输入包含多组测试用例,输出每组对应的结果。解题思路是使用普通母函数,跑完模版后枚举幂次寻找不能组成的钱数。

Problem Description

We all know that Bin-Laden is a notorious terrorist, and he has disappeared for a long time. But recently, it is reported that he hides in Hang Zhou of China!

 “Oh, God! How terrible! ” 

Don’t be so afraid, guys. Although he hides in a cave of Hang Zhou, he dares not to go out. Laden is so bored recent years that he fling himself into some math problems, and he said that if anyone can solve his problem, he will give himself up!

Ha-ha! Obviously, Laden is too proud of his intelligence! But, what is his problem? 

“Given some Chinese Coins (硬币) (three kinds-- 1, 2, 5), and their number is num_1, num_2 and num_5 respectively, please output the minimum value that you cannot pay with given coins.” 

You, super ACMer, should solve the problem easily, and don’t forget to take $25000000 from Bush! 

Input

Input contains multiple test cases. Each test case contains 3 positive integers num_1, num_2 and num_5 (0<=num_i<=1000). A test case containing 0 0 0 terminates the input and this test case is not to be processed. 

Output

Output the minimum positive value that one cannot pay with given coins, one line for one case. 

Sample Input

1 1 3
0 0 0

Sample Output

4

题意:每组给出 1 角、2 角、5 角硬币的个数 num1、num2、num5,问最小的不能组成的钱数

思路:普通母函数

根据题意,使用模版 2 较为方便,只需考虑 n2 数组的影响即可

首先 k=3,v[0]=1,v[1]=2,v[2]=3,n2[0]=num1,n2[1]=num2,n2[2]=num5,n1[0]=n1[1]=n1[2]=0

其次 P 可忽略,那么 last2 改为 last2=last+n[i]*v[i]

由于要求最小的不能组成钱数,那么在跑完模版后,枚举所有的幂次从 0 到 last,寻找 a[i]=0 的序号 i 即可。

Source Program

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#define EPS 1e-9
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
#define LL long long
const int MOD = 1E9+7;
const int N = 10000+5;
const int dx[] = {0,0,-1,1,-1,-1,1,1};
const int dy[] = {-1,1,0,0,-1,1,-1,1};
using namespace std;

int a[N];//权重为i的组合数
int b[N];//临时数组
int v[N],n1[N],n2[N];
int main(){
    v[0]=1;
    v[1]=2;
    v[2]=5;
    while(scanf("%d%d%d",&n2[0],&n2[1],&n2[2])!=EOF&&(n2[0]+n2[1]+n2[2])){
        a[0]=1;
        memset(n1,0,sizeof(n1));
        int last=0;
        for(int i=0; i<3; i++) {
//          int last2=min(last+n2[i]*v[i],P);//计算下一次的last
            int last2=last+n2[i]*v[i];
            memset(b,0,sizeof(int)*(last2+1));//只清空b[0..last2]
            for(int j=n1[i]; j<=n2[i]&&j*v[i]<=last2; j++) //last2
                for(int k=0; k<=last&&k+j*v[i]<=last2; k++) //一个是last,一个是last2
                    b[k+j*v[i]]+=a[k];
            memcpy(a,b,sizeof(int)*(last2+1));//b赋值给a,只赋值0..last2
            last=last2;//更新last
        }

        int i;
        for(i=0;i<=last;i++)
            if(a[i]==0)
                break;
        printf("%d\n",i);
    }
    return 0;
}

 

<think>我们正在分析一段STL(语句表)代码:`LDBW2`和 `AnlageDB numberload andcompare with0`。首先,需要明确STL是西门子STEP7(TIA Portal)中的一种低级编程语言,类似于汇编语言。1.**理解指令**:- `L DBW2`:这条指令的意思是加载(Load)数据块(DB)中地址为2的一个字(Word)到累加器1(ACCU1)。这里DBW表示数据块中的字(Word),地址为2。注意:在西门子PLC中,数据块中的地址通常以字节为单位,而一个字占两个字节。因此,DBW2表示从数据块的第2个字节开始的一个字(即占用第2和第3字节)。-接下来,用户提到“AnlageDB numberload andcompare with0”。这里“Anlage”可能是德语,意为“设备”或“系统”,但在此上下文中,更可能是用户描述的一部分。实际上,我们只看到了`L DBW2`,并没有看到比较指令。通常,比较指令会是`==0`、`<>0`等。所以,用户可能想表达的是:加载数据块中的某个字(DBW2)并与0比较。2.**完整的比较代码**:如果用户想要比较DBW2的值是否为0,那么后续的指令可能是:-`LDBW2`//将DBW2的值加载到累加器1- `==0`//与0比较(如果等于0,则RLO(逻辑运算结果)为1,否则为0)或者使用其他比较指令,如`<>0`(不等于0)、`>0`(大于0)等。3.**示例**:假设我们有一个数据块DB1,我们想检查DB1.DBW2是否等于0,然后在等于0时执行某个操作(比如置位一个位),代码可能如下:```OPN DB1//打开数据块DB1LDBW2//加载DB1.DBW2到ACCU1==0//比较ACCU1是否等于0=Q0.0//如果等于0,则置位Q0.0(输出位)```4. **注意**:-在STL中,比较指令会检查累加器1的内容与指定值(或另一个累加器的内容)的关系,并将比较结果(布尔值)存储在状态字的RLO中。-在STL中,数据块必须先打开(使用OPN指令)才能访问。如果之前已经打开了数据块,则无需再次打开。5.**用户意图**:用户可能是在调试一段代码,其中加载了数据块中的某个值(DBW2)并与0比较。需要确认比较的结果用于后续逻辑控制。6.**可能的问题**:-如果用户没有看到预期的比较结果,需要检查:-数据块是否正确打开?-数据块中地址2处的字是否被正确写入?-比较指令是否正确?7.**相关引用**:关于STL编程,可以参考西门子的官方文档[^1]。另外,关于C++ STL的引用(用户提供的引用[1]和[2])与这里的STL(语句表)无关,请注意区分。8.**生成相关问题**:根据用户的问题,生成以下相关问题:§§相关问题§§1.在STL中,如何正确打开数据块并访问其中的数据?2.STL中比较指令有哪些?如何使用?3.如何监控STL程序中数据块的值?4.在TIA Portal中如何调试STL程序?5.STL中累加器的作用是什么?6.数据块中DBW2的地址范围是多少?它占用哪些字节?</think>### STL代码分析:`L DBW 2` 和比较操作 在西门子TIA Portal的STL(语句表)语言中,您提供的代码涉及数据块加载和比较操作。以下是分步解析: #### 1. **指令分解** - **`L DBW 2`** - `L`:加载指令(Load),将数据复制到累加器1(ACCU1) - `DBW`:数据块字类型(Data Block Word),表示16位有符号整数 - `2`:数据块中的字节偏移地址 - **含义**:从当前打开的数据块(DB)中,读取偏移地址2处的16位字(占用地址2和3),将其加载到累加器1。 - *示例*:若`DB1.DBW2`值为`-5`,执行后ACCU1 = `-5`。 - **比较操作** 虽然没有给出完整比较指令,但典型用法是: ```stl L DBW 2 // 加载DBW2的值到ACCU1 ==0 // 比较ACCU1是否等于0 = Q0.0 // 若等于0,则置位输出Q0.0 ``` 关键比较指令: - `==0`:判断ACCU1是否等于0 - `<>0`:判断是否不等于0 - `>0`/`<0`:判断是否大于/小于0 #### 2. **内存访问细节** - **数据块结构** ```plaintext 地址 | 数据 ------------ 0 | 字节0 (DBB0) 1 | 字节1 (DBB1) 2 | DBW2低字节 (DBB2) 3 | DBW2高字节 (DBB3) ``` - `DBW2` 占用**连续两个字节**(地址2和3),按大端序存储。 - **重要规则** - 必须先使用`OPN DBx`打开数据块(如`OPN DB1`) - 未指定DB编号时,默认使用最后一次打开的DB。 #### 3. **常见问题排查** - **数据范围错误** `DBW`是**16位有符号整数**(范围:-32,768 ~ 32,767)。若实际值超范围,需改用`DBD`(32位)。 - **地址对齐问题** 字类型(`DBW`)必须从**偶数地址**开始(如2,4,6)。访问奇数地址(如`DBW3`)会导致编译错误。 - **未打开数据块** 若未执行`OPN DBx`,将触发运行时错误。 #### 4. **完整示例** ```stl // 打开数据块DB1 OPN DB1 // 检查DB1.DBW2是否等于0 L DBW 2 // 加载值到ACCU1 ==0 // 比较ACCU1 == 0? = "Tag_1" // 若为真,将结果赋给标签Tag_1 ``` > **调试建议**: > 在TIA Portal的**监控表**中监视`DB1.DBW2`的实时值,并检查状态字的`RLO`(逻辑运算结果)位确认比较结果[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值