P2392 kkksc03考前临时抱佛脚

代码思路:

最简单的思路,暴力dfs,搜索回溯。
对于每一门科目中每一个题,要么放在左脑计算,要么放在右脑计算,只需要搜索将该题目放在左脑中的花费的最小代价,和放在右脑中的最小代价,然后在所有的最小代价中取最小值即为完成该科目所需的最小代价。
将所有的最小代价相加,即为答案;

代码如下:


#include <iostream>
#include <cstdio>
#include <numeric>
#include <functional>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <climits>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <stack>
#include <queue>
#include <bitset>
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
const int maxn = 1e6 + 3;
int minn = 0x3ffffff;
const int N = 1e5 + 5;
int s[5];
int a[21][5];
int l, r;
int ans;
void dfs(int x, int y) {
	if (x > s[y]) {
		minn = min(minn, max(l, r));
		return;
	}
	l += a[x][y];
	dfs(x + 1, y);
	l -= a[x][y];
	r += a[x][y];
	dfs(x + 1, y);
	r -= a[x][y];

}
int main() {
	for (int i = 1; i <= 4; ++i) {
		cin >> s[i];
	}
	for (int p = 1; p <= 4; ++p) {
		l = r = 0;
		for (int i = 1; i <= s[p]; ++i) {
			cin >> a[i][p];
		}

		minn = 0x3ffffff;
		dfs(1, p);
		ans += minn;
	}
	cout << ans << endl;
	
}

题目进阶分析


本题题目数据比较水,所以可以用暴力搜索的方法ac掉(甚至不需要剪枝)。
实际本题可以用背包解答。

背包思路:

状态方程: f[i][j] : 选择第 i 个物品 价值为 j 时的总代价,本题中 的价值和代价是相等的,也就是f[i][j] = j
对于每一道题目,我们只需要考虑放在左脑还是右脑去思考,因此我们只需要记录完成所有题目所需要的总代价,然后以一半的代价代表着仅用半个脑子去思考部分题目,使得该脑子中所占有的代价尽可能的接近总代价的1/2,剩余的代价则在另一个脑子中,最后取两个脑子中更大的那个代价,即完成所有题目所需要的最小代价。

代码设计

#include<bits/stdc++.h>
using namespace std;

int len[4];
int sub[30];
int f[21][1201];

int main(){
    ios::sync_with_stdio(false);
    for(int i=0;i<4;i++) cin>>len[i];
    int tot=0;
    for(int i=0;i<4;i++){
        int v=0;
        for(int j=1;j<=len[i];j++) cin>>sub[j],v+=sub[j];
        sort(sub,sub+len[i]);
        int t1=0;
        for(int j=1;j<=len[i];j++)
            for(int k=0;k<=v/2;k++){
                f[j][k]=f[j-1][k];
                if(k>=sub[j])f[j][k]=max(f[j][k],f[j-1][k-sub[j]]+sub[j]);
                t1=max(f[j][k],t1);
            }
        tot+=max(t1,v-t1);
    }
    cout<<tot<<endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值