某些题 如果数据小的话 可以用二维数组形象代表 最后遍历以便 得到最优值
/*
C: 邪能炸弹
flag[i][j]表示第i天邪能值为j的情况。那么只要进行一个简单的状态转移即可。
如果flag[i-1][j]==1,则flag[i][j+xi],flag[i][j-xi]即可到达,那么-1的情况和第n天的最大值就很好求出了。
*/
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxm =1005;
int flag[55][maxm] ={ 0 }, a[maxm];
int main()
{
intn, i, j, k, sum, mx, s, answer = 0;
//freopen("F:\\Input.txt","r", stdin);
//freopen("F:\\Output.txt","w", stdout);
intt;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n, &s, &mx);
for(i = 1;i <= n;i++)
scanf("%d",&a[i]);
memset(flag,0, sizeof(flag));
flag[0][s]= 1;
for(i = 1;i <= n;i++)
{
answer= 0;
for(j = 0;j <= mx;j++)
{
if(flag[i - 1][j])
{
if(j - a[i] >= 0)
flag[i][j- a[i]] = 1, answer = 1;
if(j + a[i] <= mx)
flag[i][j+ a[i]] = 1, answer = 1;
}
}
if(!answer) break;
}
if(i <= n) { printf("-1\n");continue; }
for(i = mx;i >= 0;i--)
{
if(flag[n][i])
{
printf("%d\n",i);
break;
}
}
}
return0;
}
问题 C: 邪能炸弹
来自 <http://218.28.220.249:50015/JudgeOnline/problem.php?cid=1025&pid=2>