dp
http://acm.hdu.edu.cn/showproblem.php?pid=4842
#include<iostream> #include<cstring> #include<algorithm> using namespace std; int l,s,t,m,x; int a[120],dp[120][15],b[120]; int ans; int judge(int n){ if(n>(s-1)*s){ return 1; } if(n<0){ return 0; } return b[n]; } void learn() { int i,j; memset(b,0,sizeof(b)); memset(dp,0,sizeof(dp)); for(i=0;i<=m;i++){ for(j=0;j<t;j++){ dp[i][j]=m+1; } // cout<<dp[i][0]<<" "; } // cout<<dp[2][2]; b[0]=1; for(i=1;i<=100;i++){ for(j=s;j<=t;j++){ b[i]=b[i]||b[i-j]; } } a[0]=0; dp[0][0]=0; int v; for(i=1;i<=m;i++){ for(j=0;j<t;j++){ if(a[i]-j<=a[i-1]){ dp[i][j]=dp[i-1][j-a[i]+a[i-1]]; } else{ for(v=0;v<t;v++){ if(judge(a[i]-j-a[i-1]+v)&&dp[i-1][v]<dp[i][j]){ dp[i][j]=dp[i-1][v]; } } } if(j==0){ dp[i][j]++; } // cout<<dp[i][j]<<" "; } // cout<<endl; } ans=m+1; for(i=0;i<t;i++){ if(dp[m][i]<ans){ ans=dp[m][i]; } // cout<<dp[m][i]<<" "; } cout<<ans; } int main() { int flag=1; while(scanf("%d",&l)!=EOF){ if(flag!=1){ cout<<endl; } else{ flag=0; } cin>>s>>t>>m; memset(a,0,sizeof(a)); for(int i=1;i<=m;i++){ cin>>a[i]; } sort(a+1,a+1+m); if(s==t){ int ans1=0; for(int i=1;i<=m;i++){ if(a[i]%s==0){ ans1++; } } cout<<ans1; } else{ learn(); } } return 0; }
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1149
博客https://blog.csdn.net/u013712847/article/details/51886731