Balloons

M(M<=100)个气球,有N(N<=10)个人可以吹气球,但是只有一个工具,对于每个人i,有两个参数: 
Ai(Ai<=10)AiBi(Bi<=4)Bi。 
问吹完M个气球最少要多少分钟。

解题思路:

观察发现Bi<=4,那么显然我们可以开一个F[sum][a1][a2][a3][a4]表示还有sum个气球,前一分钟是a1在吹,前两分钟是a2在吹,以此类推。 
然后就很好做了。直接记忆化搜索就可以AC了。

AC代码:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>

using namespace std;

int F[102][11][11][11][11]={{{{{0}}}}};

int N,M;
int A[11]={0};
int B[11]={0};

int done(int sum,int a1,int a2,int a3,int a4)
{
    if(sum<=0) sum=0;
    if(F[sum][a1][a2][a3][a4]!=0x3f3f3f3f) return F[sum][a1][a2][a3][a4];
    if(sum==0)
        F[sum][a1][a2][a3][a4]=0;
    else
    {
        int flag=0;
        for(int i=1;i<=N;i++)
        {
            if(a1==i && B[i]>0) continue;
            if(a2==i && B[i]>1) continue;
            if(a3==i && B[i]>2) continue;
            if(a4==i && B[i]>3) continue;
            flag=1;
            int gg=done(sum-A[i],i,a1,a2,a3);
            F[sum][a1][a2][a3][a4]=min(F[sum][a1][a2][a3][a4],gg+1);
        }
        if(flag==0)
        {
            int gg=done(sum,0,a1,a2,a3);
            F[sum][a1][a2][a3][a4]=min(F[sum][a1][a2][a3][a4],gg+1);
        }
    }
    return F[sum][a1][a2][a3][a4];
}

int main()
{
    scanf("%d%d",&M,&N);
    memset(F,0x3f3f3f3f,sizeof(F));
    for(int i=1;i<=N;i++)
        scanf("%d%d",&A[i],&B[i]);
    printf("%d",done(M,0,0,0,0));
    return 0;

} #include <iostream> #include <queue> #include <algorithm> #include <cstring> using namespace std; struct NOde {     int x,y,z; } people[10]; int m,n1; queue<int>Q; struct number {     int x,y,z; } num[10]; int cmp(number aa,number nn) {     return aa.y > nn.y; } int cmp1(number aa,number nn) {     return aa.x > nn.x; } int bfs() {     for(int i = 0; i < n1; i++)     {         Q.push(people[i].x);         Q.push(people[i].y);     }     int sum;     int sumk = 0;     while(sum < m)     {         int cnt = 0;         memset(num,0,sizeof(num));         for(int i = 0; i < n1; i++)         {             int ai = Q.front();             Q.pop();             int bi = Q.front();             Q.pop();             if(people[i].z == 0)             {                 num[i].x = ai;                 num[i].y = bi;                 num[i].z = i;                 cnt++;             }             else                 people[i].z--;             Q.push(ai);             Q.push(bi);         }         sort(num,num+n1,cmp);         if(num[cnt-1].x!=0)         {             sum += num[cnt-1].x;             int rr = num[cnt-1].z;             people[rr].z = people[rr].y;             sumk++;         }         else             sumk++;     }     return sumk; } int bfs1() {     while(!Q.empty())         Q.pop();     for(int i = 0; i < n1; i++)     {         Q.push(people[i].x);         Q.push(people[i].y);     }     int sum=0;     int sumk = 0;     while(sum < m)     {         int cnt = 0;         memset(num,0,sizeof(num));         for(int i = 0; i < n1; i++)         {             int ai = Q.front();             Q.pop();             int bi = Q.front();             Q.pop();             if(people[i].z == 0)             {                 num[i].x = ai;                 num[i].y = bi;                 num[i].z = i;                 cnt++;             }             else                 people[i].z--;             Q.push(ai);             Q.push(bi);         }         sort(num,num+n1,cmp1);         if(num[0].x!=0)         {             sum += num[0].x;             int rr = num[0].z;             people[rr].z = people[rr].y;             sumk++;         }         else             sumk++;     }     return sumk; } int main() {     int n;     while(cin >> m >> n)     {         n1 = 0;         for(int i = 0; i<n; i++)         {             int rr,ee;             cin>>rr>>ee;             if(rr!=0)             {                 n1++;                 people[i].x = rr;                 people[i].y = ee;                 people[i].z = 0;             }         }         int sss = bfs();         for(int i = 0; i<n; i++)             people[i].z = 0;         int ssss = bfs1();         int min = sss;         if(ssss < sss)             min = ssss;         cout << min << endl;     }     return 0; }

猜你喜欢

转载自blog.csdn.net/hnust_lizeming/article/details/75669688
今日推荐