E - Jin Ge Jin Qu hao UVA - 12563

E - Jin Ge Jin Qu hao

  UVA - 12563 

E - Jin Ge Jin Qu hao UVA - 12563_第1张图片

这道题的解法就是背包问题的解法但是这道题的不同之处在于它有三个条件。
1.要保证能唱的歌的数量最多。
2.要保证在唱的歌的数量最多的前提下唱的时间最晚。
3.要保证一定要唱劲歌金曲这首歌。开始的时候我在想要怎样唱才能保证一定有时间唱劲歌金曲,后来看了一下题目,它的意思是,你只要开始唱了一首歌,那么服务员就不会让你停下来。而你一定要唱这首歌,所以你只要最少留1秒钟,也就是最后1秒给劲歌金曲唱。你留给其它歌曲的时间就变成了t-1秒。
#include 
#include
#include
#include
#include
using namespace std;
int T;
int n;
int t;
int a[55];
int d[55][9700];
int time1[55][9700];
int main()
{
    freopen("E:\\file.txt","r",stdin);
    scanf("%d",&T);
    int kase=0;
    while(T--)
    {
        kase++;
        scanf("%d%d",&n,&t); //歌的数量 和 总时间
        for(int i=1;i<=n;i++)
        {
          scanf("%d",&a[i]);  //每首歌的时间;1-n首歌
        }
        t--;
        memset(time1,0,sizeof(time1)); //每种状态的总时间
        memset(d,0,sizeof(d));       //每种状态的总歌曲数
        for(int i=n;i>=1;i--)  //1-n种 共n种歌
        {
            for(int j=0;j<=t;j++) //0-t分钟 共t分钟
            {
                if(i==n)   //如果是最后一首歌
                {
                    d[i][j]=0;
                    time1[i][j]=0;
                }
                else
                {
                    d[i][j]=d[i+1][j];  //什么都不装 到下一种
                    time1[i][j]=time1[i+1][j];  //时间不变
                }

                if(j>=a[i]) //时间是够唱第i首歌的
                {
                   if(d[i+1][j-a[i]]+1>d[i][j]) //比较歌的首数的多少
                {
                    d[i][j]=d[i+1][j-a[i]]+1;  //歌的首数加1;
                    time1[i][j]=time1[i+1][j-a[i]]+a[i]; //如果选择了这首歌 歌的时间就要累加
                }
                if(d[i+1][j-a[i]]+1==d[i+1][j])
                {
                    if(time1[i+1][j-a[i]]+a[i]>time1[i][j])//如果时间长一些 就选择时间长的歌  注意 此时总时间要减
                    time1[i][j]=time1[i+1][j-a[i]]+a[i];
                }
                }

            }


        }
        cout<<"Case "<



你可能感兴趣的:(动态规划,动态规划)