南邮 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]);
}