南邮 OJ 1307 子集树问题

子集树问题

时间限制(普通/Java) :  1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 28            测试通过 : 12 

比赛描述

 试设计一个用回溯法搜索子集空间树的函数。该函数的参数包括结点可行性判定函数和上界函数等必要的函数,并将此函数用于解装载问题。

装载问题描述如下:有一批共n个集装箱要装上艘载重量为c的轮船,其中集装箱i的重量为i w 。找出一种最优装载方案,将轮船尽可能装满,即在装载体积不受限制的情况下,将尽可能重的集装箱装上轮船。



输入

第一行有2个正整数n和c。n是集装箱数,c是轮船的载重量。接下来的1行中有n个正整数,表示集装箱的重量。

输出

计算出最大装载重量

样例输入

5 10
7 2 6 5 4

样例输出

10

提示

 

题目来源

算法设计与实验题解




/* Time Limit Exceed at Test 4   用回溯果断超时
#include<iostream>

int n,c,*a,maxC;

void tryPos(int p, int cc){
	if(maxC < cc){
		maxC = cc;
	}
	if(p==n || cc>c){
		return;
	}
	if(cc+a[p]<=c){
		tryPos(p+1,cc+a[p]);
	}
	tryPos(p+1,cc);
}

int main(){
//	freopen("test.txt","r",stdin);
	int i;
	scanf("%d%d",&n,&c);
	a = new int[n];
	for(i=0;i<n;i++){
		scanf("%d",a+i);
	}
	tryPos(0,0);
	printf("%d\n",maxC);
}
*/



/* AC 1MS
#include<iostream>
#define MAX_N 100
#define MAX_C 1000
using namespace std;

int a[MAX_N];
int dp[MAX_N][MAX_C];

int main(){
//	freopen("test.txt","r",stdin);
	int n,c,i,j,temp1,temp2;
	scanf("%d%d",&n,&c);
	for(i=1;i<=n;i++){
		scanf("%d",a+i);
	}
	for(i=1;i<=n;i++){
		for(j=1;j<=c;j++){
			temp1 = dp[i][j-1];
			if(temp1<(temp2=dp[i-1][j])){
				temp1 = temp2;
			}
			if(j-a[i]>=0 && temp1<(temp2=a[i]+dp[i-1][j-a[i]])){
				temp1 = temp2;
			}
			dp[i][j] = temp1;
		}
	}
	printf("%d\n",dp[n][c]);
}
*/



#include<iostream>
#define MAX_N 100
#define MAX_C 1000
using namespace std;

int a[MAX_N];
int dp[MAX_N][MAX_C];

int main(){
//	freopen("test.txt","r",stdin);
	int n,c,i,j,temp1,temp2;
	scanf("%d%d",&n,&c);
	for(i=1;i<=n;i++){
		scanf("%d",a+i);
	}
	for(i=1;i<=n;i++){
		for(j=1;j<=c;j++){
			temp1 = dp[i-1][j];
			if(j-a[i]>=0 && temp1<(temp2=a[i]+dp[i-1][j-a[i]])){
				temp1 = temp2;
			}
			dp[i][j] = temp1;
		}
	}
	printf("%d\n",dp[n][c]);
}






你可能感兴趣的:(ACM,南邮OJ,子集树问题)