题目:
题目链接:走路 - 题目 - Daimayuan Online Judgehttp://oj.daimayuan.top/course/11/problem/460
思路:
01背包变种问题
我们设计dp[i][j]数组
i代表第i次选择
j代表所在的位置
我们只需要在每次选择时
从 0 到 j 遍历上一次的数组
对上一次的数组能够到达地方取下一次能够到达的地方
且要注意不能超过题目所给的m值
#include<stdio.h>
#include<iostream>
using namespace std;
int dp[106][(int)1e5+3];
int main()
{
int n, m,x,y;
cin >> n >> m;
dp[0][0] = 1;//初始化
for (int i = 1; i <= n; i++)//取了第几种走法
{
scanf("%d%d", &x, &y);//取第i步能走的两种情况
for (int j = 0; j <= m; j++)//
{
if (dp[i-1][j] == 1 && j + x <= m)//假如能走a没到达边界且之前能够到达
{
dp[i][j + x] = 1;//对该位置进行标记方便走下一步判断能否走
}
if (dp[i - 1][j] == 1 && j + y <= m)//假如能走b没到达边界且之前能够到达
{
dp[i][j + y] = 1;//对该位置进行标记方便走下一步判断能否走
}
}
}
for (int j = 0; j <= m; j++) printf("%d", dp[n][j]);//输出取前n个能到达的情况
return 0;
}
PS:晚来天欲雪,能饮一杯无。