思路:從最後一個數開始考慮,是否放入 k-數列 中,因爲後面的數不影響前面的數,並且總步數不超過n*n。
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define LL long long int dp[23000][152]; int n,s,m; int a[151]; int main() { scanf("%d%d%d",&n,&m,&s); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } s=min(s,n*n); memset(dp,0x3f,sizeof(dp)); dp[0][0]=0; for(int i=n;i>=1;i--) { for(int j=s;j>=0;j--) { for(int k=m;k>=0;k--) { if(k-1<0||j-(i-m+k-1)<0)continue; dp[j][k]=min(dp[j][k],dp[j-(i-m+k-1)][k-1]+a[i]); } } } int ans=999999999; for(int i=0;i<=s;i++) { ans=min(ans,dp[i][m]); } printf("%d\n",ans); return 0; }