原题链接:走路 - 题目 - Daimayuan Online Judge
解题思路:本题是标准使用动态规划解题的题目。每一步遍历上一步0到m格,如果上一步的第j格能走,也就是标为1,那么更新这一步的j+a与j+b格(如果j+a或j+b超过了m,那么超过的就不需要更新)。
然后因为从第0格出发,所以给第0步的第0格标为1,否则后续没有出发点就无法更新。
AC代码:
#include<bits/stdc++.h>
using namespace std;
bool dp[110][100010];//前一个维度用来表示第几步,后一个用来表达数轴上第几格
int n,m;//题目原意
int main(){
cin>>n>>m;
dp[0][0]=1;//出发点在第0格
for(int i=1;i<=n;i++){//循环读入n步并处理
int a,b,minn;
cin>>a>>b;
minn=min(a,b);//记录较小的值
for(int j=0;j<=m-minn;j++){//超过m减去较小值的部分必定不能往后走了
if(a+j<=m) dp[i][a+j]|=dp[i-1][j];//如果第i-1步的第j格为1代表能达到,那么第i步的j+a与j+b格也必然能达到
if(b+j<=m) dp[i][b+j]|=dp[i-1][j];
}
}
for(int i=0;i<=m;i++) printf("%d",dp[n][i]);//输出答案
return 0;
}