题目: 分析:还好坚持着想了下去,题目放在这个题单,我想到的是在背包问题上进行一定修改的dp。 仅仅对状态转移附近的代码进行修改就可以啦。 代码: #include<bits/stdc++.h> using namespace std; long long A[5505][5505];//dp int B[5505];// 原始数据 int m,w,s;// 原料总数 容纳max 取max int main() { for(int i=0;i<5505;i++) for(int j=0;j<5505;j++) A[i][j]=-(1<<30); cin>>m>>w>>s; for(int i=1;i<=m;i++) cin>>B[i]; //初始化使用第一种材料 值为B[1] for(int i=1;i<5505;i++) A[1][i]=B[1]; for(int i=2;i<=m;i++) for(int j=1;j<=w;j++) { for(int k=0;k+j<=w && k<s;k++) { A[i][j]=max(A[i][j],A[i-1][j+k]+min(i,j)*B[i]); } if(j==1) continue; A[i][j]=max(A[i][j],A[i-1][j-1]+min(i,j)*B[i]); } for(int i=1;i<=m;i++) { // for(int j=1;j<=w;j++) cout<<A[i][j]<<' '; // cout<<endl; } long long minn=A[m][1]; for(int i=1;i<=w;i++) { minn=max(minn,A[m][i]); } cout<<minn; } 结果虽然不咋地,但自己深入思考了,这个题也很好的,哈哈哈哈!!!