题目大意:有初始数字x,max和n个数字z[i],每次必须在x上加或减z[i],数字不能超过max或小于0,求最大能达到的数字
题解:考虑到数值范围较小,暴力遍历所有状态即可
我的收获:似乎是一种通用的Dp思路
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int M=55;
int n,be,mx,c[M];
bool f[M][1005];
void work()
{
for(int i=1;i<=n;i++)
{
for(int j=mx;j>=0;j--){
if(j+c[i]<=mx) f[i][j+c[i]]|=f[i-1][j];
if(j-c[i]>=0) f[i][j-c[i]]|=f[i-1][j];
}
}
for(int i=mx;i>=0;i--)
if(f[n][i]){printf("%d\n",i);return ;}
puts("-1");
}
void init()
{
cin>>n>>be>>mx;
for(int i=1;i<=n;i++)
scanf("%d",&c[i]);
f[0][be]=1;
}
int main()
{
init();
work();
return 0;
}