不懂就问——P1833
  • 板块P1833 樱花
  • 楼主jyhDora2011
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/7/13 21:15
  • 上次更新2023/11/3 10:00:53
查看原帖
不懂就问——P1833
747070
jyhDora2011楼主2023/7/13 21:15

单纯问问,为什么题解里说这题需要 二进制优化,要不然普通的混合背包之能得80分?

可是我用普的算法也可以(应该没有优化)

代码如下:

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int n,dp[102505],w[60230],v[60330],s[6230],ns,nf,es,ef;
int main()
{
    scanf("%d:%d%d:%d%d",&ns,&nf,&es,&ef,&n);
    int m=(es*60+ef)-(ns*60+nf);
    for(int i=1;i<=n;i++)
    {
    	cin>>v[i]>>w[i]>>s[i];
    }
    for(int i=1;i<=n;i++)
    {
	if(s[i]==1)
	{
 	     for(int j=m;j>=v[i];j--)
	     {
	         dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
     	      }
	 }
	 else if(s[i]==0)
	 {
	     for(int j=v[i];j<=m;j++)
	     {
	          dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
	      }
	  }
	  else if(s[i]>1)
  	  {
  	      for(int j=m;j>=v[i];j--)
	      {
	          for(int k=1;k<=s[i]&&j>=k*v[i];k++)
			    {
					dp[j]=max(dp[j],dp[j-k*v[i]]+k*w[i]);
				}
			}
		}
	}
	printf("%d",dp[m]);
    return 0;
}

求解.........

2023/7/13 21:15
加载中...