计蒜客里的一道背包dp题,

1615925431 2017-06-02 07:15:55
晓萌最近被调动到了县博物馆工作,准备安排一次文物外借的展出。现在有N个文物准备外借给M个外地博物馆,已知每个博物馆最多可以容纳体积为T的外借文物。很不巧的是,晓萌对这些文物的价值并不了解,于是他决定根据以下标准进行选择:文物必须按照考古发现的时间外借给外地博物馆、现有准备外借的文物尽可能的都被借出、越早发现的文物要借给约先来借文物的外地博物馆。

输入第1行,包括一个空格分隔的三个整数,分别为N 、T和M(1≤N,M,T≤20)。输入第2行包括N个整数,按照文物发现的早晚列出每个文物对应的需要展出的展位体积.

输出包括一个整数,包括最多可以外接出的文物的数量。



样例输入
4 5 2
4 3 4 2

样例输出
3
...全文
631 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Bowen_Yang 2018-07-11
  • 打赏
  • 举报
回复
过了10组数据,还有两组
Bowen_Yang 2018-07-11
  • 打赏
  • 举报
回复
#include <iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;

int n,vol,k;
vector<int> v;
int dp[103];
int path[103][103];
int main()
{

v.clear();
scanf("%d %d %d",&n,&vol,&k);
int item;
v.push_back(-1);
for( int i = 1 ; i <= n ; i++ )
{
scanf("%d",&item);
v.push_back(item);
}
vector<int> era;
int ans = 0;
for( int s = 1 ; s <= k ; s++ )
{
era.clear();
memset(dp,0,sizeof dp);
memset(path,0,sizeof path);
for( int i = 1 ; i < v.size() ; i++ )
for( int j = vol ; j >= v[i] ; j-- )
{
if( dp[ j-v[i] ]+1 > dp[j] )
{
dp[j] = dp[ j-v[i] ]+1;
path[i][j] = 1;
}
}
for( int i = v.size()-1, j = vol ; i >= 1 && vol > 0 ; i-- )
{
if( path[i][j] )
{
j -= v[i];
era.push_back(i);
// cout<<" era "<<i<<endl;
}
}
ans += era.size();
//cout<<" ans "<<ans<<endl;
for( int i = 0 ; i < era.size() ; i++ )
v.erase( v.begin()+era[i] );
}
printf("%d\n",ans);

return 0;
}
/*
5 2 5
6 1 1 1 1

5 2 5
1 1 6 1 1

*/

33,006

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧