题目描述:
输入n和k,n代表钢条长度,k代表可以切成1~k的长度,接下来输入k个数代表切成Di长度可得到的价值,求最大价值,和切割方案(字典序最小);
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int INF=1<<30;
const int maxn=1000;
int dp[maxn],v[maxn],way[maxn];
int n,k;
int main(){
while(scanf("%d%d",&n,&k)==2){
for(int i=1;i<=k;++i){
scanf("%d",&v[i]);
}
dp[0]=0;
for(int i=1;i<=n;++i){
dp[i]=-INF;
for(int j=1;j<=k;++j){
//dp[i]=max(dp[i],v[j]+dp[i-j]);
if(i>=j&&dp[i]<v[j]+dp[i-j]) {
way[i]=j;
dp[i]=v[j]+dp[i-j];
}
}
}
printf("%d\n",dp[n]);
//print
while(n){
printf("%d ",v[way[n]]);
n-=v[way[n]];
}
}
return 0;
}
如有不当之处欢迎指出!