您的位置:首页 > 其它

南邮 OJ 1307 子集树问题

2015-08-05 14:28 281 查看

子集树问题

时间限制(普通/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
;
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
[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
[c]);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息