예제 #1
0
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;
}
예제 #2
0
파일: 1786.cpp 프로젝트: cpsa3/backup
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;
}
예제 #3
0
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;
}