题目描述
设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是li ,1 < = i < = n。 程序存储问题要求确定这n 个程序在磁带上的一个存储方案,使得能够在磁带上存储尽可能多的程序。在保证存储最多程序的前提下还要求磁带的利用率达到最大。 对于给定的n个程序存放在磁带上的长度,编程计算磁带上最多可以存储的程序数和占用磁带的长度。
输入
第一行是2 个正整数,分别表示文件个数n <=600和磁带的长度L<=6000。接下来的1 行中,有n个正整数,表示程序存放在磁带上的长度。
输出
第1 行输出最多可以存储的程序数和占用磁带的长度;第2行输出存放在磁带上的每个程序的长度。
样例输入
9 50
2 3 13 8 80 20 21 22 23
样例输出
5 49
2 3 13 8 23
参考程序
#include<bits/stdc++.h>
using namespace std;
struct dp{
int sum;
int lon;
vector<int> num;
dp(){
sum=0;
lon=0;
num.clear();
}
};
int main(){
int n,l;
cin>>n>>l;
int prg[n+1];
for(int i=1;i<=n;i++){
cin>>prg[i];
}
dp Dp[6005];
for(int i=n;i>0;i--){
int s=prg[i];
for(int j=l;j>=0;j--){
if(j>=s){
if(Dp[j].sum<Dp[j-s].sum+1||Dp[j].sum==Dp[j-s].sum+1&&Dp[j].lon<=Dp[j-s].lon+s){
Dp[j].sum=Dp[j-s].sum+1;
Dp[j].lon=Dp[j-s].lon+s;
Dp[j].num=Dp[j-s].num;
Dp[j].num.push_back(s);
}
}
}
}
cout<<Dp[l].sum<<" "<<Dp[l].lon<<endl;
for(int i=Dp[l].num.size()-1;i>=0;i--)
{
if (i != Dp[l].num.size() - 1)
cout << " ";
cout << Dp[l].num[i];
}
cout<<endl;
return 0;
}
注意
该程序仅供学习参考!