103 | 走路 |
有一条很长的数轴,一开始你在0的位置。接下来你要走n步,第ii步你可以往右走ai或者bi。
问n步之后,0到m的每个位置,能不能走到?
输入格式
第一行,两个整数n,m。
接下来nn行,每行两个整数ai,bi。
输出格式
一行,一共m+1个数,每个数都是
0
或1
表示能否走到,数字之间不用空格隔开。输入样例
3 10 1 2 2 6 3 3
输出样例
00000011001
数据规模
对于所有数据,保证1≤n≤100,1≤m≤105,1≤ai,bi≤1000。
AC代码如下:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<vector>
#include <iomanip>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
#define fo(x) for(int i = 1;i<=x;++i)
#define ios ios::sync_with_stdio(false);cin.tie(0), cout.tie(0)
const int N = 1e6+9;
int q[109][2];//0->a 1->b
bool ans[100100];//1->ok , 0->not;
int n,m;
void dfs(int cnt,int d)
{
if(cnt==n||d>m)//剪支
return ;
else
{
ans[d] = 1;
dfs(cnt+1,d+q[cnt+1][0]);
dfs(cnt+1,d+q[cnt+1][1]);
}
}
int main()
{
ios;
scanf("%d %d",&n,&m);
for(int i = 1;i<=n;i++)
scanf("%d %d",&q[i][0],&q[i][1]);
dfs(0,0);
for(int i = 0;i<=m;i++)
{
if(ans[i]) printf("0");
else printf("1");
}
}