南邮 OJ 1307 子集树问题

来源:互联网 发布:端口镜像配置 编辑:程序博客网 时间:2024/06/16 22:24

子集树问题

时间限制(普通/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 1000using 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 1000using 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]);}






0 0
原创粉丝点击