归纳蓝桥杯的这道题总结了一定对于dp的看法,虽然还没看到y总的动态规划,自己搜了搜上学期算法中学到的01背包问题。
首先动态规划问题最重要的是状态转移方程,将问题抽象成数学问题,列出方程就可以得解。
#include<cstdio>
#include<cmath>
using namespace std;
int n,ans,sum,w[101],dp[101][100001];
int main(){
scanf ("%d",&n);
for(int i=1;i<=n;i++){
scanf ("%d",&w[i]);
sum+=w[i];
}
for(int i=1;i<=n;i++){
for(int j=sum;j;j--){
if(j==w[i])dp[i][j]=1;
else if(dp[i-1][j])dp[i][j]=1;
else if(dp[i-1][j+w[i]])dp[i][j]=1;
else if(dp[i-1][abs(j-w[i])])dp[i][j]=1;
}
}
for(int i=1;i<=sum;i++)if(dp[n][i])ans++;
printf ("%d",ans);
return 0;
}
以后有更深的见解再更新吧,现在大致看懂了dp解题的大概思路了,基本都是两层循环加优化