题目:
分析:按照无限背包模板,数组不够大。
三重循环-超时-代码:
long long A[10000005];
int main()
{
cin>>t>>n;
for(int i=0;i<n;i++)
{
cin>>a[i][1]>>a[i][0];
}
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];
}
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];
}