int main() { int i, j, k; while ( scanf("%d %d", &CASH, &N) != -1 ) { if( N == 0) { printf("%d\n", 0); continue; } memset(dp, 0, sizeof(dp)); sum_bills = 0; int t_num, t_val; for(i=1; i<=N; i++) { scanf("%d %d", &t_num, &t_val); if( t_num > 0 ) { int alfa = 1; while( (t_num - alfa) >= 0 ) { t_num -= alfa; val[++sum_bills] = alfa * t_val; alfa *= 2; } if ( t_num ) val[++sum_bills] = t_num * t_val; } } if( CASH == 0 ) { printf("%d\n", 0); continue; } get_ans(); for(i=CASH; i>=0; i--) { if( dp[i] == 1 ) { printf("%d\n", i); break; } } } return 0; }
int get_ans(int s,int k)//返回s的容量从第k件物品开始放最少需要几件 { int i,ans=99999999,t; if(s%w[k]==0)//若能整除直接返回 return s/w[k]; if(k==N)//没有放满且后面没有物品就返回-1 return -1; int l=min(s/w[k],w[k+1]-1);//遍历的上限 //比如说接下来的数是w[k+1],我只要考虑w[k]最多少放(w[k+1]-1)次即可 for(i=0;i<=l;i++)//遍历少放w[k]的次数0至w[k+1]-1 { t=get_ans(s%w[k]+i*w[k],k+1); if(t==-1)//不能放满 continue; ans=min(t+s/w[k]-i,ans); } return ans; }
int main() { sum = 0; memset(dp, 0, sizeof(dp)); scanf("%d %d", &N, &B); int i; for(i=1; i<=N; i++) { scanf("%d", &heights[i]); sum += heights[i]; } get_ans(); for(i=B; i<=sum; i++) { if( dp[i] == 1 ) { printf("%d\n", (i-B)); break; } } return 0; }