2021年5月1号-5月9号ACM学习日志

学习内容:背包问题和回顾知识

背包问题:
在51假期我也是把ppt好好了看了一遍,因为老师在课堂上讲的时候我可能会听不懂,所以正好趁着这个假期把ppt看了一遍,结果,在老师上课时我真觉得轻松了很多,毕竟我知道题的解法和思路了。
01背包:就是每个只能选一次。而完全背包就是没有数量限制,任意选。他们在代码上的不同就在于第二重循环上,01背包是从v到0,完全背包是从0到v,就是因为内循环的不同导致的。
然后老师又讲了多重背包,这个我看ppt的时候就不怎么明白,简单来说就是把01背包和完全背包放一块了,但细节上还是有很多不同的。需要多做题熟悉才行。
然后我发现,背包问题使用的状态数组基本都是一维的,但也有题目出现二维,题就很新颖,就像vj背包问题的f题,用dp[i][0]来存最大的方案,dp[i][1]来存最大的方案数有几种可能。自己确实没想到,查了一下才明白,还能这样做,很是启发。

#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <map>
#include <algorithm>
#include <queue>
#include <stack>
#include <cmath>
using namespace std;
typedef long long  ll;
#define INF 0x3f3f3f3f3f
#define t() cin>>t; while(t--)
#define mem(x) memset(x,INF,sizeof(x))
#define rep(m,n,h) for(int m=n;m<=h;m++)
#define cls(x) memset(x,0,sizeof(x))
const ll maxn=0x7fffffffffffffff;
const int N=2003;
const int mod=1e3+7;
int  num,x,y,z,ans,k,m,n,i,j,h,f,dp[N][2],dp2[N][N],minn,ma,sum,t,r,v;
int a[N],b[N];
double temp;
char st[5005],u;
map <char,int> sf;
void set(int x,int y,int z);
struct node
{
    int x,y,e;
} d[N];
bool cmp(node a,node b)
{
    return a.e<b.e;
}
char s[N];
int main()
{
   // freopen("C:\\Users\\lenovo\\Desktop\\in.txt","r",stdin);
    std::ios::sync_with_stdio(false);
    t()
    {
        cin>>n>>v;
        rep(i,1,n)
        cin>>a[i];
        cls(dp);
        rep(i,0,v)
        dp[i][1]=1;
        rep(i,1,n)
        for(j=v; j>=a[i]; j--)
        {
                if(dp[j][0]==dp[j-a[i]][0]+1)
                    dp[j][1]=dp[j-a[i]][1]+dp[j][1];
                else if(dp[j][0]<dp[j-a[i]][0]+1)
                {
                    dp[j][0]=dp[j-a[i]][0]+1;
                    dp[j][1]=dp[j-a[i]][1];
                }
        }
        if(dp[v][0])
            cout<<"You have "<<dp[v][1]<< " selection(s) to buy with " <<dp[v][0]<<" kind(s) of souvenirs."<<endl;
        else
            cout<<"Sorry, you can't buy anything."<<endl;

    }
    return 0;
}

久而久之,我也发现,不管是那种dp题,重点都是状态方程上面,找到相同的一个位置,然后思考能从哪些位置到达这里,有什么边界条件,先初始化一次。通过一次的计算,我们能把所有的情况算出来,然后取我们想要的那种情况。

感想:对于没参加省赛,自己很是后悔,毕竟要三个人,我找了很多人还是没找到,最终还是屈服于现实,昨晚看了看那些打省赛的同学的博客,看见他们的集训总结,我就感觉那种参加比赛,一做就是5小时,三个人齐心协力的感觉很好。我感觉他们比我强很多,不单单是独自做题的能力,他们还知道团队配合。昨晚真的惭愧了好久,不知道以后还能不能参加,下次一定要找好人去参加。再说下这几天干了什么吧,51假期我也没回家,因为我觉得就那几天不值当的,然后就在宿舍里看我之前做过的题,有的题当时可能不太懂,但是ac了,就是有些套路性的代码,我把他搞懂了。ACM学习到现在,我越发觉得学的东西难了,从贪心,我有的题不用搜题解就能做出来,到了线性dp,dp题的想法思路我和之前大不一样,刚做的时候真的感觉难上加难,渐渐的才略懂一些,加上这几天背包问题的作业做的少,压力越来越大了。还有cf上的比赛,我上次那个div2没有ac,当时我是写完代码了,然后提交一次错一次,但我感觉我的思路没出错,就很着急嘛,改了一顿提交上还是错误,就是感觉自己有点害怕,有点紧张。怕自己连一道题都做不对,当时我都质疑我的之前的学习水平了。经过那次比赛,我反省了一下自己,打比赛时不会做或者代码不对也不要慌,没什么大不了的,稳住心态可能可能会有意想不到的惊喜。还有就是,我觉得我应该再挤点时间来学习ACM,仔细想一想,平时还是有很多空闲的时间。再次说一下,没能参加省赛,没能找到队友,真的好惭愧,好后悔。每次看见其他同学a了很多到题,我就觉得,自己还不够强,自己还是普普通通的,就想着,他们好厉害,我要赶上他们的步伐。他们集训了5天,每天都在刷题,而我却没有,内心有点恐惧,他们越来越厉害,我还能赶上他们吗。还有一点就是,打cf的时候,没到比赛结束不能松懈,万一在剩下的极短时间里自己有了好的思路呢,万一又ac了呢,我之前不是这样,每到比赛快结束,我就觉得我不能再a一道题了,就松懈了,在看见他们辛辛苦苦集训了5天后,我觉得我应该更加努力了,再挤点时间看题,不然怎么赶上他们。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值