机试练习

机试练习

深搜+回溯

背包问题

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <stack>
#include <map>
#include <string>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;


// 01背包回溯法
int w[20];
int c[20];
int max1 = -1;
int n,m;
void dfs(int index,int summ,int sumc)
{ // 背包的解树需要到第n+1层才能判断出来最后一个物品选没选
    if (index == n) // 第n+1层
    {
        if (sumc > max1)
        {
            max1 = sumc;
            return ;
        }
    }
    else
    {
        dfs(index+1,summ,sumc); // 没选择第index件物品
        if (summ+w[index] <= m) // 加上这件物品没有超重,才递归下一层
            dfs(index+1,summ+w[index],sumc+c[index]);
    }
}
int main()
{
    cin >> n >> m;
    int summ=0,sumc=0;
    for (int i=0;i<n;i++)
        cin >> w[i];
    for (int i=0;i<n;i++)
        cin >> c[i];
    dfs(0,summ,sumc);
    cout << max1 <<endl;


    return 0 ;
}

N个数中取K个,并且有最大平方和

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <stack>
#include <map>
#include <string>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
// 从数组A中选择K个整数,使其和为x,并写出解

int n,k,x,maxSum = 0,a[20]={0};
vector<int> t,ans;
int countSum()
{
    int sum = 0;
    for (int i=0;i<t.size();i++)
    {
        sum += t[i]*t[i];
    }
    return sum;
}
void dfs(int index,int sumk,int sumx)
{
    if (index == n)
    {
        if (sumk == k && sumx == x)
        {
            int nowSum = countSum();
            if (nowSum > maxSum)
            {
                maxSum = nowSum;
                ans = t; // 保存当前一条最优路径
            }
        }
    }
    else
    {
        if (sumk+1 <= k && sumx+a[index] <= x) //可以选择当前的数
        {
            t.push_back(a[index]); // 把当前路径存储
            dfs(index+1,sumk+1,sumx+a[index]);
            t.pop_back();
        }
        dfs(index+1,sumk,sumx);//没选当前数字
    }
}

int main()
{

    cin >> n >> k >> x;
    for (int i=0;i<n;i++)
        cin >> a[i];
    t.clear();ans.clear();
    dfs(0,0,0);
    cout << maxSum << endl;
    for (int i=0;i<ans.size();i++)
        cout << ans[i] <<' ';

    return 0 ;
}

猜你喜欢

转载自blog.csdn.net/qq_33846054/article/details/80736834
今日推荐