UVA 10032(Tug of War)


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

路途中。。。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值