 /**//*
題意:有n種食物需要準備,每種食物一個人需要x[i],有庫存y[i]
每種食物都有兩種購買的選擇,s1[i],p1[i],s2[i],p2[i]
s,p分別為物品的數量還有價格
問最多能滿足多少人,每個人都要同時滿足n種

二分人數limit,然后判可行性
可行性判斷有兩種方法:
1) 完全背包做 n*10^6左右
2) 枚舉其中一種物品的數量(要選較少的那個枚舉,不然會TLE) 這種比較快
如果知道其中一種物品的數量的話,另一種可直接計算出來
啟示:
這種做法快,主要是由于只枚舉個數(不枚舉容量),而且確定了一種的個數,另外一種也會確定的!
*/
#include<cstdio>
#include<algorithm>
#include<cstring>

using namespace std;

const int MAXN = 101;
const int INF = 1000000000;

 inline int min(int a,int b) {return a<b?a:b;}

int s1[MAXN],s2[MAXN],p1[MAXN],p2[MAXN];
int x[MAXN],y[MAXN];
int dp[1000101];//最多也就10^6
int N,M;

//int cal(int n,int need)
//{
// int m = need+s2[n];
// fill(dp,dp+m+1,INF);
// dp[0]=0;
// for(int j=0;j<=m;j++)
// {
// if(dp[j]==INF)continue;
// if(j+s1[n]<=m)
// dp[j+s1[n]]=min(dp[j+s1[n]],dp[j]+p1[n]);
// if(j+s2[n]<=m)
// dp[j+s2[n]]=min(dp[j+s2[n]],dp[j]+p2[n]);
// }
// return *min_element(dp+need,dp+m+1);
//}
//
//bool chk(int limit)
//{
// int cost = 0;
// for(int i=1;i<=N;i++)
// {
// int need = limit*x[i]-y[i];
// if(need>1000000)return false;//對于超過10^6的,直接false
// if(need>0)
// cost+=cal(i,need);
// if(cost>M)return false;
// }
// return true;
//}

bool chk(int limit)
  {
int cost = 0;
for(int i=1;i<=N;i++)
 {
int Min = INF , need = limit*x[i]-y[i];
if(need<=0)Min=0;
else
 {
//最多能買的個數
int na = (M-cost)/p1[i];
int nb = (M-cost)/p2[i];
if(na<nb)
 {
for(int a=0,b;a<=na;a++)
 {
int tmp = need-a*s1[i];
if(tmp<=0)b=0;
else b = (tmp-1)/s2[i]+1;//取上界 如果a=0,b=1時就不能用(a-1)/b+1來計算!
Min = min(Min,a*p1[i]+b*p2[i]);
if(b==0)break;
}
}
else
 {
for(int b=0,a;b<=nb;b++)
 {
int tmp = need-b*s2[i];
if(tmp<=0)a=0;
else a = (tmp-1)/s1[i]+1;
Min = min(Min,a*p1[i]+b*p2[i]);
if(a==0)break;
}
}
}
cost+=Min;
if(cost>M)return false;
}
return true;
}

int main()
  {
//freopen("in","r",stdin);
while(scanf("%d%d",&N,&M),N||M)
 {
for(int i=1;i<=N;i++)
scanf("%d%d%d%d%d%d",&x[i],&y[i],&s1[i],&p1[i],&s2[i],&p2[i]);
int low = 0 ,high = M+10;
while(high-low>1)
 {
int mid=(high+low)>>1;
if(chk(mid))low=mid;
else high=mid;
}
printf("%d\n",low);
}
return 0;
}
|
|
常用鏈接
隨筆分類
Links
搜索
最新評論

|
|