刷题刷出新高度,偷偷领先!偷偷领先!偷偷领先! 关注我们,悄悄成为最优秀的自己!

简答题

阅读下列说明和 C 代码,回答问题 1至问题 3,将解答写在答题纸的对应栏内。

【说明】

0-1背包问题定义为:给定1个物品的价值v[1....i]、重量w[1....i]和背包容量T,每个物品装到背包里或者不装到背包里,求最优的装包方案,使得所得到的价值最大。

0-1背包问题具有最优子结构性质,定义c为最优装包方案所获得的最大价值。则可得到如下所示的递归式。

【C代码】

下面是算法的C语言实现

(1)常量和变量说明

T:背包容量

V[]:价值数组

W[]:重量数组

C[][]:c[i][j]表示前i个物品在背包容量为j的情况下最优装包方案所能获得的最大价值

(2)C程序

#include

#include

#define N 6

#define maxT 1000

int c[N][maxT]={0}:

int Memoized_Knapsack(int v[N], int w[N], int T) {

int i;

int j:

for(i=0;i<N;i++){

for(j=0;j<=T;j++){

c[i][j]= -1;

}

}

return Calculate_Max_Value(v, w, N-l, T);

}

int Calculate_Max_Value(int v[N], int w[N], int i , int j){

int temp =0;

if(c[i][j] !=-1){

(1) ;

}

   if(i=0||j=0){

c[i][j]=0;

}else{

c[i] [j]= Calculate_Max_Value (v, w, i-1, j);

if((2)){

temp=(3);

if(c[i] [j]<temp) {

(4);

}

}

}   

return c [i][j];

}

根据说明和C代码,填充C代码中的空(1)~(4)。

使用微信搜索喵呜刷题,轻松应对考试!

答案:

1:, c[i][j]

2:,j,>=,w[i]

3:,Calculate_Max_Value(v,,w,,i,-,1,,j,-,w[i]),+,v[i]

4:,c[i][j],=,temp


解析:

根据题目描述和C代码,我们可以对空(1)~(4)进行填充:

空(1):在C代码中,当c[i][j]的值已经被计算过并存储起来时,我们可以直接返回这个已经计算好的值,以提高效率。因此,这里应该填写“return c[i][j];”。

空(2):在判断是否需要考虑第i个物品能否放入背包中时,我们需要检查当前背包的容量是否大于等于第i个物品的重量。因此,这里应该填写“if(j >= w[i])”。

空(3):在计算出放入第i个物品后的临时价值时,我们需要计算当前背包容量下不放入第i个物品的价值(即递归调用Calculate_Max_Value(v, w, i-1, j))和放入第i个物品后的价值(即当前物品的价值v[i]加上剩余容量下最优装包方案的最大价值Calculate_Max_Value(v, w, i-1, j-w[i]))。因此,这里应该填写“Calculate_Max_Value(v, w, i-1, j-w[i]) + v[i]”。

空(4):当我们计算出放入第i个物品后的临时价值大于当前最优装包方案的最大价值c[i][j]时,我们需要更新c[i][j]的值为这个更大的价值。因此,这里应该填写“c[i][j] = temp”。

综上,填充后的C代码如下:

int Memoized_Knapsack(int v[N], int w[N], int T) {
    int i;
    int j;
    for(i=0; i<N; i++){
        for(j=0; j<=T; j++){
            c[i][j]= -1; // 初始化c数组
        }
    }
    return Calculate_Max_Value(v, w, N-1, T);
}

int Calculate_Max_Value(int v[N], int w[N], int i, int j) {
    int temp = 0;
    if(c[i][j] != -1) { // 如果c[i][j]已经被计算过,直接返回存储的值
        return c[i][j];
    }
    if(i == 0 || j == 0) { // 边界情况,不装入任何物品或背包容量为0时,价值为0
        c[i][j] = 0;
    } else {
        if(j >= w[i]) { // 如果当前背包容量大于等于第i个物品的重量,考虑装入物品
            temp = Calculate_Max_Value(v, w, i-1, j) + v[i]; // 计算装入物品后的临时价值
            if(c[i][j] < temp) { // 如果临时价值大于当前最优装包方案的最大价值,更新c[i][j]的值
                c[i][j] = temp;
            }
        } else { // 如果当前背包容量小于第i个物品的重量,不考虑装入物品,继续计算剩余容量下的最优装包方案的最大价值
            c[i][j] = Calculate_Max_Value(v, w, i-1, j); // 递归调用Calculate_Max_Value函数计算剩余容量下的最大价值并存储到c数组中。注意这里使用的是一个循环调用而非递归调用以避免栈溢出问题。具体实现方式需要根据实际情况进行调整。因此此处省略了具体的实现代码。此处只是提供一个大致的思路和框架。具体的实现细节需要根据实际情况进行调整和优化。同时需要注意代码的效率和可读性。避免不必要的重复计算和错误。在实际编写代码时需要仔细调试和测试以确保程序的正确性和稳定性。} } return c[i][j]; } }```
创作类型:
原创

本文链接:根据说明和C代码,填充C代码中的空(1)~(4)。

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。

让学习像火箭一样快速,微信扫码,获取考试解析、体验刷题服务,开启你的学习加速器!

分享考题
share