202209(第27次)CSP真题202209-2 何以包邮?

这篇具有很好参考价值的文章主要介绍了202209(第27次)CSP真题202209-2 何以包邮?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

202209(第27次)CSP真题202209-2

何以包邮,CSP刷题过程,动态规划,算法,c++何以包邮,CSP刷题过程,动态规划,算法,c++

题目分析

多件物品,可以看成买和不买,用0/1来表示,一共有2^n次方种可能,因此枚举全部可能暴力解决即可,不过题目需要用到位运算。

位运算

#include<iostream>
#include<algorithm>

using namespace std ;
const int N = 1000 ;

int main()
{
    int n = 10 ;
    for (int i = 3 ; i >= 0 ; i--) cout << (n >> i & 1)  ;
    puts("") ;
    for (int i = 0 ; i <= 3 ; i++) cout << (n >> i & 1)  ;
    return 0 ;
}

有了这些准备后,就可以上代码了

解题1

#include<iostream>
#include<cstring>
using namespace std ;

int main()
{
    int n , x ;
    int m = 1 ;
    cin >> n >> x ;
    
    int a[32] ;
    for (int i = 1 ; i <= n ; ++i)
    {
        cin >> a[i] ;
        m = m * 2 ;
    }
    int mincost = 0x3f3f3f3f;
    // memset(mincost , 0x3f , sizeof mincost) ;
    for (int i = 1 ; i < m ; ++i)
    {
        int temp = i  , cost = 0;
        for (int j = 0 ; j <= n - 1; ++j)
        {
            cost += a[j+1] * (temp >> j & 1) ;
        }
        if (cost >= x && cost < mincost) mincost = cost ;
    }
    cout << mincost ;
}

代码改进

n<=30,2^n*n就远远超过1e7-1e8了,因此我们选择迭代价格,也就是O(n * 30 * 1e4),但是,在价格中会有很多重复价格,因此下一个选择时,不用再去迭代多次,我们选择set集合存储价钱即可,这里要好好体会。

解题2

#include<iostream>
#include<set>
#include<algorithm>

using namespace std ;

int main()
{
    int n ,  x ;
    cin >> n >> x ;
    int a[32] ;
    for (int i = 1 ; i <= n ; ++i)
    {
        cin >> a[i] ;
    }
    set<int> Cost[32] ;
    Cost[0].insert(0) ; // 显然第0本书买和不买价钱都是0

    for (int i = 1 ; i <= n ; ++i)
    {
        for (set<int>::iterator it = Cost[i-1].begin() ; it != Cost[i-1].end() ; ++it)
        {
            int p = *it ;
            Cost[i].insert(*it) ;
            Cost[i].insert(*it + a[i]) ;
        }
    }
    for (set<int>::iterator it = Cost[n].begin() ; it != Cost[n].end() ; ++it)
        {
            int p = *it ;
            if (p >= x)
            {
                cout << p ;
                break;
            }
        }
    return 0 ;
}

解题3

背包问题简述

采用了滚动数组,不理解可以自己先自学一下。

for (int i = 1 ; i <= n ; ++i) // 遍历物品
    {
        int v , w;
        cin >> v >> w ; 
        for (int j = m ; j >= v ; j--) // 防止一个物品多次添加,并且满足j >= w[i]
        {
            f1[j] = max(f1[j] , f1[j - v] + w) ;
        }
    }
    cout << f1[m] ;

通过背包问题来解决,思路与递推类似,其实这就是一个简单的0/1背包问题,但是m变成了pre(也就是钱),dp[i]][j]数组表示的是在前i个物品花费j的钱能买到那几本书的最大值,那么是不是就要求我如果想加入第i本书的话,必须要求此时的j >= a[i],这里完成之后,我们来思考怎样得到答案,题目要求我们得到满足x包邮条件的最小值,由此分析 dp[n][j]表示前n个物品,花费j钱能买到的书的最大值,那么当这个最大值大于x的第一个值,就是我们要的最优解。

	dp[0][0]=0;
	cin >> n >> x;

	for(int i= 1 ;i <= n ; i ++){
        cin>>a[i],pre+=a[i];//pre最大容量 
    }
    
    for (int i = 1 ; i <= n ; ++i)
    {
        for (int j = 1 ; j <= pre ; ++j)
        {
            if (j >= a[i])
            {
                dp[i][j] = max(dp[i-1][j] , dp[i-1][j-a[i]] + a[i]) ;
            } else {
                dp[i][j] = dp[i-1][j] ;
            }
        }
    }
	//这里从x开始是因为我们满足包邮的最优条件就是x,x可能是解,也可能不是解
    for (int i = x ; i <= pre ; ++i)
    {
        if (dp[n][i] >= x)
        {
            cout << dp[n][i] ;
            break;
        }
    }

到这为止,你应该知道了0/1背包的思想,那么此刻用滚动数组的思维来解决此问题,因为题目不需要我么记录整个最优的过程

#include<iostream>
#include<algorithm>

using namespace std;
int n,x,a[50],dp[300050],pre;//dp数组容量1e4*30组 
int main()
{
	dp[0]=1;
	cin>>n>>x;
	for(int i=0;i<n;i++)cin>>a[i],pre+=a[i];//pre最大容量 
	for(int i=0;i<n;i++)
	{
		for(int j=pre;j>=a[i];j--)
		{
			dp[j]=max(dp[j],dp[j-a[i]]+a[i]);//01背包 
		}
	}
	for(int i=x;i<=pre;i++)
	{
		if(dp[i]>=x)
		{
			cout<<i<<endl;
			break;
		}
	}
	return 0;
}

总结

这道题的背包我想了比较久,主要开始分不清a[i]的作用,建议学习dp一定要找个简单的样例自己模拟一遍,有了这个思想,想dp问题是很简单的。文章来源地址https://www.toymoban.com/news/detail-661909.html

到了这里,关于202209(第27次)CSP真题202209-2 何以包邮?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【学会动态规划】摆动序列(27)

    目录 动态规划怎么学? 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后: 学习一个算法没有捷径,更何况是学习动态规划, 跟我一起刷动态规划算法题,一起学会动态规划! 题目链接:376. 摆动序列 - 力扣(LeetCo

    2024年02月11日
    浏览(37)
  • 【日常系列】LeetCode《27·动态规划2》

    =10^4 😮(n^2) =10^7:o(nlogn) =10^8:o(n) 10^8=:o(logn),o(1) 1)爬楼梯、打家劫舍问题 2)0-1,多重,完全,二维被动背包问题 lc 70【剑指 10 - 2】【top100】: 爬楼梯 https://leetcode.cn/problems/climbing-stairs/ 提示: 1 = n = 45 lc 746【剑指 088】:使用最小花费爬楼梯 https://leetcode.cn/problems/min-cost-cli

    2023年04月24日
    浏览(24)
  • 算法27:从暴力递归到动态规划(2)

    上一题比较简单,下面来一道比较难的题目。 假设有排成一行的 N 个位置,记为 1~ N , N 一定大于或等于 2 开始时机器人在其中的 M 位置上 ( M 一定是 1~ N 中的一个 ) 如果机器人来到 1 位置,那么下一步只能往右来到 2 位置; 如果机器人来到 N 位置,那么下一步只能往左来到

    2024年02月09日
    浏览(38)
  • 《动态规划》刷题训练

    你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统, 如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动

    2024年01月19日
    浏览(46)
  • Leetcode 刷题 动态规划

    309. 最佳买卖股票时机含冷冻期 1. 确定dp数组以及下标的含义 具体可以区分出如下四个状态: 状态一:持有股票状态(今天买入股票,或者是之前就买入了股票然后没有操作,一直持有) 不持有股票状态,这里就有两种卖出股票状态 状态二:保持卖出股票的状态(两天前就

    2024年02月11日
    浏览(46)
  • 【C++刷题】动态规划

    这里我先声明一下dp问题的做题方法: 1.确定状态表示 2.确定状态方程 3.处理初始化问题(一般是下标的映射或者初始化保证填表正确) 4.确定填表顺序 5.根据状态表示确定返回值。 链接:点此进入 状态表示:以 i 位置为结尾的第i个斐波那契数。 状态转移方程:dp[i] = dp[i-1]

    2024年02月09日
    浏览(38)
  • 动态规划各种背包问题刷题

    动态规划 两个约束条件 最优子结构 :为了计算考虑了前 i 个物品,总体积为 j 时的最大收益,我们可以先计算考虑了前 i - 1 个物品,总体积为 j 时的最大收益以及考虑了前 i - 1 个物品,总体积为 时的最大收益。知道了考虑了前 i - 1 个物品,总体积为 j 时的最大收益以及考

    2024年02月09日
    浏览(38)
  • 【C++刷题】【动态规划篇】(一)

    1. 题目链接:1137.第N个泰波那契数 2. 题目描述: 泰波那契序列 Tn 定义如下: T0 = 0, T1 = 1, T2 = 1, 且在 n = 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2 给你整数 n,请返回第 n 个泰波那契数 Tn 的值。 3. C++算法代码: 滚动数组优化后的C++代码: 1. 题目链接:面试题 08.01. 三步问题 2. 题目描述:

    2024年02月08日
    浏览(44)
  • 动态规划算法OJ刷题(3)

    问题描述 给出一个字符串s,分割s使得分割出的每一个子串都是回文串。计算将字符串s分割成回文串的最小切割数。例如:给定字符串s=“aab”,返回1,因为回文分割结果[“aa”,“b”]是切割一次生成的。 解题思路 方法1:用一维数组来完成,O(N^3) 注意转移方程必须是让两个

    2024年02月14日
    浏览(39)
  • 【力扣刷题】整数拆分(动态规划)

    个人简历: 全栈领域新星博主, 万粉博主、 帮助初学者入门,记录自己的学习过程 个人主页:天寒雨落的博客_CSDN博客-C,CSDN竞赛,python领域博主 热门专栏:初学者入门C语言_天寒雨落的博客-CSDN博客   目录 动态规划 整数拆分 题目 思路 代码 执行结果 其基本思想是将待求解

    2024年02月03日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包