思路:用dp[i]表示,总石子数为i时最少需要拿多少次石头,最后从k到0进行判断次数在m以内的最大石头数即可
#include<bits/stdc++.h>
using namespace std;
const int N = 105;
int arr[N];
int dp[3005];
const int inf =0x7ffffff;
int main(){
int n,m,k;
cin>>n>>m>>k;
for(int i =1;i<=n;i++)cin>>arr[i];
for(int i =1;i<=k;i++)dp[i]=inf;
for(int i =1;i<=n;i++){
for(int j =k;j>=arr[i];--j){
dp[j]=min(dp[j],dp[j-arr[i]]+1);
}
}
int ans=0;
for(int i =k;i>=0;--i){
if(dp[i]<=m)
{
ans = i;
break;
}
}
cout<<ans<<endl;
}