比赛描述
试设计一个用回溯法搜索子集空间树的函数。该函数的参数包括结点可行性判定函数和上界函数等必要的函数,并将此函数用于解装载问题。
装载问题描述如下:有一批共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]); }