TJU1040

本文介绍了一种使用动态规划(DP)思想解决数学问题的方法,通过保存已求解的状态来加速查找过程。具体实现中,算法存储了所有取自x1到xm的数模n的余数,通过扩展余数并加上x1到xm中的数,判断是否满足条件,从而输出解或继续搜索。
用DP的思想保存已经求出的解的话速度会快一些。保存现今求出的所有取自x1~xm的数mod n的余数。扩展的时候就用一个余数乘以10,分别加上x1~xm,判断是否mod n为0,如果是,输出解,否则存入队列继续查找。
None.gif#include<iostream>
None.gif
using namespace std;
None.gif
None.gif
const int max_size = 0x40000;
None.gif
int queue[max_size];
None.gif
int num[10];
None.gif
int seq[10];
None.gif
int n,m;
None.gif
void Print(int i);
None.gif
int main()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    
int data,i,j,temp,flag;
InBlock.gif    cin
>>data;
InBlock.gif    
while(data-- > 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        cin
>>n>>m;
InBlock.gif        
for(i=0;i<m;i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            cin
>>j;
InBlock.gif            num[j] 
= 1;
ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
//first process simple status.
InBlock.gif
        if( ((n%10 == 5&& (num[5== 0 && num[0== 0)) || ((n%10 == 0&& (num[0== 0)) )
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            cout
<<"0\n";
InBlock.gif            
goto finish;
ExpandedSubBlockEnd.gif        }

InBlock.gif        
if(n%2 == 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
for(j=0,i=0;i<10;i+=2)
InBlock.gif                
if(num[i]) j=1;
InBlock.gif            
if(!j)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                cout
<<"0\n";
InBlock.gif                
goto finish;
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

InBlock.gif        
//Sort number used
InBlock.gif
        for(i=0,j=0;i<10;i++)
InBlock.gif            
if(num[i])
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                queue[j] 
= (seq[j] = i) % n;
InBlock.gif                
if(queue[j] == 0 && seq[j] != 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    cout
<<seq[j]<<endl;
InBlock.gif                    
goto finish;
ExpandedSubBlockEnd.gif                }

InBlock.gif                j
++;
ExpandedSubBlockEnd.gif            }

InBlock.gif        
//i for status
InBlock.gif
        for(i=j;i<max_size;i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            temp 
= (queue[i/m-1]*10 + seq[i%m]) % n;
InBlock.gif            
if(0 == temp)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
for(j=i,flag=0;j>=0;j=j/m-1)
InBlock.gif                    
if(seq[j%m] != 0) flag = 1;
InBlock.gif                
if(flag)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    Print(i);
InBlock.gif                    
goto finish;
ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }

InBlock.gif            queue[i] 
= temp;
ExpandedSubBlockEnd.gif        }

InBlock.gif        cout
<<"0\n";
InBlock.giffinish:
InBlock.gif        
for(i=0;i<10;i++) num[i] = 0;
ExpandedSubBlockEnd.gif    }

InBlock.gif    
return 0;
ExpandedBlockEnd.gif}

None.gif
void Print(int i)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    
char s[501],*p=s;
InBlock.gif    
*p++ = '\0';
InBlock.gif    
while(i>=0)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
*p++ = seq[i%m] + '0';
InBlock.gif        i 
= i / m - 1;
ExpandedSubBlockEnd.gif    }

InBlock.gif    
while(*--p) cout<<*p;
InBlock.gif    cout
<<endl;
ExpandedBlockEnd.gif}

None.gif

转载于:https://www.cnblogs.com/FancyMouse/articles/263948.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值