Pagini recente » Cod sursa (job #854188) | Cod sursa (job #886702) | Cod sursa (job #714383) | Cod sursa (job #2771027) | Cod sursa (job #2340590)
#include <cstdio>
#include <map>
#include <cstring>
using namespace std;
const int doila17 = 1<<17;
struct Dinamica
{
int ans,luat;
} dp[doila17+5];
int cost[20];
map<int,int> mp;
int main()
{ freopen("zebughil.in", "r",stdin);
freopen("zebughil.out", "w",stdout);
int n,g,i,put2,k,doilan,ii,nr,nrr;
put2=1;
for(i=0; i<=17; i++){
mp[put2]=i;
put2*=2;
}
for(k=1; k<=3; k++){
memset(dp, 20, sizeof(dp));
dp[0].ans=0;
scanf("%d%d", &n, &g);
dp[0].luat=g;
for(i=0; i<n; i++)
scanf("%d", &cost[i]);
doilan=1<<n;
for(i=1; i<doilan; i++){
ii=i;
while(ii){
nr=ii&(ii-1);
nr=ii-nr;
nrr=mp[nr];
if(cost[nrr]<=g-dp[i-nr].luat){
if(dp[i].ans>dp[i-nr].ans){
dp[i].ans=dp[i-nr].ans;
dp[i].luat=cost[nrr]+dp[i-nr].luat;
}
else
if(dp[i].ans==dp[i-nr].ans && dp[i].luat>cost[nrr]+dp[i-nr].luat)
dp[i].luat=cost[nrr]+dp[i-nr].luat;
}
else{
if(dp[i].ans>dp[i-nr].ans+1){
dp[i].ans=dp[i-nr].ans+1;
dp[i].luat=cost[nrr];
}
else
if(dp[i].ans==dp[i-nr].ans+1 && dp[i].luat>cost[nrr])
dp[i].luat=cost[nrr];
}
ii&=(ii-1);
}
}
printf("%d\n", dp[doilan-1].ans);
}
return 0;
}