Pagini recente » Cod sursa (job #540669) | Cod sursa (job #639978) | Cod sursa (job #2939579) | Cod sursa (job #1091562) | Cod sursa (job #2397605)
#include <fstream>
using namespace std;
ifstream in("lapte.in");
ofstream out("lapte.out");
const int N=102;
pair<int,int>v[N],obiect[N*N];
int n,cnt,L,profit[2][N*N],index[N*N];
bool a[N*N][N];
void citire();
void reset(int l);
void create(int time);
bool rucsac(int time)
{
create(time);
reset(cnt);
for(int i=1;i<=cnt;i++)
{
for(int j=L-obiect[i].first, k=L-obiect[i].second;max(k,j)>0;)
{
if(j>k)
{
if(profit[1][j]!=-1 && profit[1][j]+v[index[i]].first>profit[1][j+obiect[i].first])
{
profit[1][j+obiect[i].first]=profit[1][j]+v[index[i]].first;
}
j--;
}
else
{
if(profit[2][j]!=-1 && profit[2][j]+v[index[i]].second>profit[2][j+obiect[i].second])
{
profit[2][j+obiect[i].second]=profit[2][j]+v[index[i]].second;
}
k--;
}
}
}
return (profit[2][cnt]>=L);
}
int main()
{
citire();
int p=0;
for(int bit=14;bit>=0;bit--)
if(!rucsac(p+(1<<bit)))
p=p+(1<<bit);
out<<p+1;
return 0;
}
void citire()
{
in>>n>>L;
for(int i=1;i<=n;i++)
in>>v[i].first>>v[i].second;
}
void reset(int l)
{
for(int i=1;i<=l;i++)
{
profit[1][i]=-1;
profit[2][i]=-1;
}
for(int i=1;i<=l;i++)
for(int j=1;j<=n;j++)
a[i][j]=false;
}
void create(int time)
{
cnt=0;
for(int i=1;i<=n;i++)
for(int j=0;j<=time;j++)
{
obiect[++cnt].first=v[i].first*j;
obiect[cnt].second=v[i].second*(time-j);
index[cnt]=i;
}
}