这个开始的时候就用01背包3维数组,不知超时了多少次了,及其的伤感。后来用vector容器来做就可以防止超时发生了。
简单总结一下vector用法,因为在动规里面经常要用到的。
vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。
vector里面的数据是动态分配的,使用push_back()的一系列分配空间常常决定于文件或一些数据源。如果想知道vector存放了多少数据,可以使用empty()。获取vector的大小, 可以使用size()。例如,如果想获取一个vector v的大小,但不知道它是否为空,或者已经包含了数据,如果为空想设置为-1,你可以使用下面的代码实现:
int nSize = v.empty() ? -1 : static_cast<int>(v.size());
删除vector中的数据 :vector能够非常容易地添加数据,也能很方便地取出数据,同样vector提供了erase(),pop_back(),clear()来删除数据,当删除数据时,应该知道要删除尾部的数据,或者是删除所有数据,还是个别的数据
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
int q[58][25000],w[108];
vector<int >dp[58];
int main(){
int t,n,i,j,z;
int ant1,ant2,sum;
int count,count2=0;
scanf("%d",&t);
while(t--){
sum=0;
if(count2 != 0) printf("\n");
count2=1;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d",&w[i]);
sum+=w[i];
}
dp[0].push_back(0); //这个复初值是必要的。
memset(q,0,sizeof(q));
ant1=sum/2;
ant2=(n+1)/2;
for(i=1;i<=n;i++){
for(j=min(i,ant2)-1;j>=0;j--){
for(z=dp[j].size()-1; z>=0 ; z--){ //节约时间的核心。
if(q[j+1][dp[j][z]+w[i]] == 0 && dp[j][z]+w[i] <= ant1){ //q数组防止重新修改,保存容器里面的数据,以免被覆盖。
q[j+1][dp[j][z]+w[i]]=1;
dp[j+1].push_back(dp[j][z]+w[i]);
}
}
}
}
count=0;
for(i=0;i<dp[ant2].size();i++){
count=max(dp[ant2][i],count);
}
for(i=1;i<=ant2;i++) dp[i].clear();
printf("%d %d\n",count,sum-count);
}
return 0;
}
路途中。。。