洛谷:P1616 疯狂的采药(dp,背包基础)

题目:

在这里插入图片描述

分析:按照无限背包模板,数组不够大。

三重循环-超时-代码:

long long A[10000005];
int main()
{
 cin>>t>>n;
 for(int i=0;i<n;i++) 
 {
  cin>>a[i][1]>>a[i][0];//0-价值   1-时间 
 }
 memset(A,0,sizeof(A));
 for(int i=0;i<=t;i++)
 {
  long long c=i/a[0][1];
  A[i]=c*a[0][0];
 }
 for(int i=1;i<n;i++)
 {
  for(int j=t;j>=0;j--)
  {
   for(int k=0;;k++)
   {
    if(k*a[i][1]>j) break;
    if(A[j]<A[j-k*a[i][1]]+k*a[i][0]) A[j]=A[j-k*a[i][1]]+k*a[i][0];
   }
  }
 }
 cout<<A[t];
}

可以直接二维,无限背包思路就没必要?代码应该没问题,不知道为什么re

#include<bits/stdc++.h>
using namespace std;
int t,n;
int a[1010][2];//第一个元素是:价值   第二个是:时间 
long long A[10000005];
int main()
{
 cin>>t>>n;
 for(int i=0;i<n;i++) 
 {
  cin>>a[i][1]>>a[i][0];//0-价值   1-时间 
 }
 memset(A,0,sizeof(A));
 for(int i=0;i<=t;i++)
 {
  long long c=i/a[0][1];
  A[i]=c*a[0][0];
 }
 for(int i=1;i<n;i++)
 {
  for(int j=a[i][1];j<=t;j++)
  {
    if(A[j]<A[j-a[i][0]]+a[i][0]) A[j]=A[j-a[i][1]]+a[i][0];
  }
 }
 cout<<A[t];
}

猜你喜欢

转载自blog.csdn.net/weixin_42721412/article/details/107649414
今日推荐