由于昨天js给我讲了一下一系列的背包问题,今天一大早就高兴的来到工作室开始弄背包题,没想杯具就从这开始了,,一开始写的还算顺利,但就写好准备提交时,不论优化不优化就一直tle。。最后只好找lj要了代码,,一看完全一样,,但为什么我的总是tle,百思不得其解,,最后在不断的郁闷下发现这道题的测试数据竟然没有结束的标记。。坑爹啊,整整耗了我两个小时。。
法一:
#include<iostream>
#include<string.h>
#include<string>
using namespace std;
typedef struct str
{
int v;
int num;
}Node;
Node s[51];
int dp[400000];
int main()
{
int n;
while(cin>>n&&n>=0)
{
int sum=0;
for(int i=0;i<n;++i)
{
cin>>s[i].v>>s[i].num;
sum+=s[i].v*s[i].num;
}
memset(dp,0,sizeof(dp));
for(int i=0;i<n;++i)
{
for(int j=1;j<=s[i].num;++j)
for(int k=sum/2;k>=s[i].v;--k)
dp[k]=max(dp[k],dp[k-s[i].v]+s[i].v);
}
cout<<sum-dp[sum/2]<<" "<<dp[sum/2]<<endl;
}return 0;
}
二进制优化后2的k次方小于n+1
#include<iostream>
#include<string.h>
#include<string>
using namespace std;
int v[360];
int dp[400000];
int main()
{
int n;
while(cin>>n&&n>=0)
{
if(!n)
{ cout<<0<<" "<<0<<endl;
continue;
}
int sum=0;
int tot=0;
for(int i=0;i<n;++i)
{ int a,b;
cin>>a>>b;
sum+=a*b;
int t=1;
while(t*2<b+1)
{
v[tot++]=t*a;
t=t*2;
}
v[tot++]=(b+1-t)*a;
}
memset(dp,0,sizeof(dp));
for(int i=0;i<tot;++i)
for(int k=sum/2;k>=v[i];--k)
dp[k]=max(dp[k],dp[k-v[i]]+v[i]);
cout<<sum-dp[sum/2]<<" "<<dp[sum/2]<<endl;
}return 0;
}