Example:pick numbers (scicily 1158 http://soj.me/1158)
菜鸟:BFS
大牛:DP
大牛的代码:你用多长时间看懂了?
/**
* sicily 1158 pick numbers
* M, N (2<=M<=10, 2<=N<=10),
**/
#include <iostream>
using namespace std;
#define Max 15
#define Mid 200 // 和的范围[-190,190]
int main_()
{
int m,n,ans;
int a[Max][Max]; // matrix
bool dp[Max][Max][Mid*2]; // 第三维代表“到达一个位置所有的路径之和(-190到190之间)
while(cin>>m>>n)
{
memset(a, 0, sizeof(a));
memset(dp, false, sizeof(dp));
ans = -1;
int i,j;
for(i=1; i<=m; i++)
for(j=1; j<=n; j++)
cin >>a[i][j];
dp[1][1][Mid + a[1][1]] = true; // 加上Mid 防止下标为负
for(i=1; i<=m; i++)
for(j=1; j<=n; j++)
if(i!=1 || j!=1)
{
for(int k=0; k<Mid*2; k++) // 遍历所有的路径和
{
if(dp[i-1][j][k]) // 可以从上边到达
dp[i][j][k+a[i][j]] = true;
if(dp[i][j-1][k]) // 从左边到达
dp[i][j][k+a[i][j]] = true;
}
}
for(int k=Mid+1; k<Mid*2; k++) // 最小的正值
if(dp[m][n][k])
{
ans = k-Mid;
break;
}
cout << ans << endl;
}
return 0;
}