码迷,mamicode.com
首页 > 其他好文 > 详细

fzoj 2116 买糖果

时间:2014-11-05 00:03:39      阅读:226      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   io   color   ar   os   for   

Problem 2116 买糖果

Accept: 76    Submit: 294
Time Limit: 1000 mSec    Memory Limit : 32768 KB

bubuko.com,布布扣 Problem Description

清明君、五一君和六一君三个人是好朋友。

他们很喜欢去一家糖果店买糖果,糖果店有巧克力和草莓两种口味的糖果出售。清明君喜欢吃巧克力味的糖果,六一君喜欢吃草莓味的糖果,五一君是个吃货,两种口味的糖果他都很喜欢吃。店老板把两种口味的糖果混在一起装在罐子里,于是每个罐子里每种糖果的数量都可能不相同。

这一天,清明君、五一君和六一君三个人去买糖果。他们的钱只能购买m罐糖果。清明君想要a颗巧克力味的糖果,六一君想要b颗草莓味的糖果,五一君则想要糖果的数量越多越好。五一君想知道在满足清明君和六一君的要求下,自己最多能吃到多少颗糖果。

bubuko.com,布布扣 Input

输入包含多组数据。

每组数据,第一行为两个整数n,m(1<=m<=n<=100),分别表示糖果店里糖果的总罐数和他们能够买到糖果的罐数。

接下来有n行,每行两个整数x,y(0<=x,y<=10),表示第i罐糖果里有x颗巧克力味糖果和y颗草莓味糖果。

最后一行为两个整数a,b。表示清明君想要a颗巧克力味的糖果,六一君想要b颗草莓味的糖果。

bubuko.com,布布扣 Output

每组测试数据输出一个整数占一行,为五一君最多能吃到糖果的个数。如果没有能满足清明君和六一君要求的方案,则输出-1。

bubuko.com,布布扣 Sample Input

3 2 1 10 3 2 3 4 5 3

bubuko.com,布布扣 Sample Output

4

bubuko.com,布布扣 Source

FOJ有奖月赛-2013年4月(校赛热身赛)
 
思路:加了限制条件的背包问题,dp[k][i][j]表示背包容量为 k ,巧克力味糖果有i
草莓味糖果为j时,可以取到的最大糖果数目
我们发现i+j==dp[k][i][j] ,所以第三维可以去掉;
bubuko.com,布布扣
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<set>
#include<stack>
#include<map>
#include<ctime>
#include<bitset>
#define LL long long
#define INF 0x3f3f3f3f
#define maxn 60010
#define eps 1e-6
#define mod 1000000007
using namespace std;

int dp[110][1010] ;
int x[110],y[110] ;
int main()
{
    int i,n,m,j,k;
    int a,b,sum;
    while(scanf("%d%d",&n,&m) != EOF)
    {
        sum=0;
        for( i =1 ; i <= n ;i++){
            scanf("%d%d",&x[i],&y[i]) ;
            sum += x[i];
        }
        scanf("%d%d",&a,&b) ;
        memset(dp,-INF,sizeof(dp)) ;
        dp[0][0]=0;
        for( i = 1 ; i <= n ;i++)
            for( j = min(m,i) ; j >= 1 ;j--)
                for( k = sum ; k >= x[i];k-- )
                {
                    dp[j][k]=max(dp[j][k],dp[j-1][k-x[i]]+x[i]+y[i]) ;
                }
        int ans=-1;
        for( k = 1 ; k <= m ;k++){
            for( i = a ; i <= sum;i++)
            {
                if(dp[k][i]-i<b) continue;
                ans=max(dp[k][i]-a-b,ans) ;
            }
        }
        printf("%d\n",ans);
    }
    return 0 ;
}
View Code

 

fzoj 2116 买糖果

标签:des   style   blog   http   io   color   ar   os   for   

原文地址:http://www.cnblogs.com/20120125llcai/p/4075086.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!