算法笔记上P271 01背包 BFS

//算法笔记上P271   01背包  BFS
#include <cstdio>

using namespace std;
const int maxn = 30;
int n,V,maxValue = 0;//V背包容量
int w[maxn],c[maxn];//w[i]--每件物品的质量  c[i]---每件物品的价值
//DFS  index为当前处理的物品编号
//sumW 和 sumC 分别为当前总重量和当前的总价值
void DFS(int index,int sumW,int sumC){
    if(index == n){
        if(sumW <=V && sumC > maxValue)  maxValue = sumC;
        return ;
    }

    DFS(index+1,sumW,sumC);// 不选第index的物品
    DFS(index+1,sumW+w[index],sumC+c[index]);//选第index的物品
}


//剪枝升级版
void DFS_2(int index,int sumW,int sumC){
    if(index == n)  return;
    DFS(index+1,sumW,sumC);// 不选第index的物品

    //只有加入第index件物品后未超过容量V,才能继续
    if(sumW + w[index] <= V){
        if(sumC + c[index] > maxValue)   maxValue = sumC + c[index];
        DFS_2(index+1,sumW+w[index],sumC+c[index]);

    }

}


int main(){
    scanf("%d%d",&n,&V);
    for(int i=0;i<n;++i) scanf("%d",&w[i]);

    for(int i=0;i<n;++i)  scanf("%d",&c[i]);
//    DFS(0,0,0);
    DFS_2(0,0,0);

    printf("%d\n",maxValue);

    return 0;

}

/**
测试数据
5 8
3 5 1 2 2
4 5 2 1 3


10




 */




//算法笔记上P273    BFS
#include <cstdio>
#include <vector>
#include <iostream>
using namespace std;
const int maxn = 100;

//序列A中n个数选k个数使得和为x,最大平方和为maxSumSqu
int n,k,x,maxSumSqu = -1,A[maxn];
vector<int> temp,ans; // temp存放临时方案,ans存放平方和最大的方案
//当前处理index号整数,当前已选整数个数为nowK
// 当前已选整数之和为sum,当前已选整数平方和为sumSqu

void DFS(int index,int nowK,int sum,int sumSqu){

//    cout<<index<<nowK<<sum<<sumSqu<<endl;

    if(nowK == k && sum == x){ // 找到k个数的和为x
        if(sumSqu > maxSumSqu){
            maxSumSqu = sumSqu;
            ans = temp;
        }
        return ;
    }
    //已经处理完n个数,或者超过k个数,或者和超过x,返回
    if(index == n || nowK > k || sum > x)  return;
    temp.push_back(A[index]); // 选择index号数
    DFS(index+1,nowK+1,sum+A[index],sumSqu+A[index]*A[index]);
    temp.pop_back();
    //不选index号数
    DFS(index+1,nowK,sum,sumSqu);
}


//若题干修改为   数字可以重复选择
void DFS_2(int index,int nowK,int sum,int sumSqu){

//    cout<<index<<nowK<<sum<<sumSqu<<endl;

    if(nowK == k && sum == x){ // 找到k个数的和为x
        if(sumSqu > maxSumSqu){
            maxSumSqu = sumSqu;
            ans = temp;
        }
        return ;
    }
    //已经处理完n个数,或者超过k个数,或者和超过x,返回
    if(index == n || nowK > k || sum > x)  return;
    temp.push_back(A[index]); // 选择index号数
    DFS_2(index,nowK+1,sum+A[index],sumSqu+A[index]*A[index]);//修改本行   index+1  ---- 》  index
    temp.pop_back();
    //不选index号数
    DFS_2(index+1,nowK,sum,sumSqu);
}

int main(){
    //todo  此处如何给数组直接赋值
//    A = {1,2,3,4};
/*
    A[0] = 1;
    A[1] = 2;
    A[2] = 3;
    A[3] = 4;

    n = 4;
    k = 2;
    x = 6;

    DFS(0,0,0,0);

    for(int i=0;i<ans.size();++i){
        printf("%d ",ans.at(i));
    }

*/
    cout<<"demo2:"<<endl;
    A[0] = 1;
    A[1] = 4;
    A[2] = 7;
    n = 3;
    k = 5;
    x = 17;
    DFS_2(0,0,0,0);

    for(int i=0;i<ans.size();++i){
        printf("%d ",ans.at(i));
    }

    return 0;

}



全部评论

相关推荐

求好运眷顾🙏🏻:翻译:面试前没盘点好hc一下面太多了,现在在排序回去等通知
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务