UVA 10032(Tug of War)

来源:互联网 发布:易辅客栈模块源码 编辑:程序博客网 时间:2024/05/12 16:15


这个开始的时候就用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;}

路途中。。。

原创粉丝点击