2023.11.25学习笔记

集合 Subset Sums

P1466 [USACO2.2] 集合 Subset Sums - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)


背包板子题,有一说一看出来很简单贴ac code

复制代码
#include<iostream>
using namespace std;

long long  a[50];

int main()
{
    int n;   cin>>n;
    int sum=0,ans=0;
    for(int i=1;i<=n;i++)sum+=i;
    if(sum%2==0)sum>>=1;
    else{
        cout<<0;
        exit(0);
    }
    a[0]=1;
    for(int i=n;i>0;i--)
    {
        for(int j=sum;j>=0;j--)
        {
            if(a[j])a[j+i]+=a[j];
        }
    }
    cout<<a[sum]/2;
    system("pause");
    return 0;
}
复制代码

一般dp解决没有问题,但是也可以用dfs解,虽然我一开始就想到了dfs,但是由于我是蒟蒻所以没有写出来,下面贴佬的dfs:

 

复制代码
#include<cstdio>
typedef long long LL;
const int M=1e3+5;
LL b[M];
int n;
LL ans;
int main(){
    scanf("%d",&n);
    if(((1+n)*n/2)&1)puts("0");
    else{
        for(int i=0;i<(1<<(n/2));++i){
            int cur=0;
            for(int j=0;(i>>j)>0;++j)if((i>>j)&1)cur+=(j+1);
            b[cur]++;
        }
        for(int i=0;i<(1<<(n-n/2));++i){
            int cur=0;
            for(int j=0;(i>>j)>0;++j)if((i>>j)&1)cur+=j+n/2+1;
            if((1+n)*n/4>=cur)
            ans+=b[(1+n)*n/4-cur];
        }
        printf("%lld\n",ans/2);
    }
    return 0;
}
复制代码

。。。。。。。。


 

神奇的四次方数

P1679 神奇的四次方数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 

先构造,再背包

复制代码
#include<iostream>
using namespace std;

const int N=100005;
long long a[N],b[N];

int main()
{
    int k=0;
    a[0]=1;
    for(int i=1;i*i*i*i<=N;i++){
        b[k++]=i*i*i*i;
    }
    int n;     cin>>n;
    for(int i=0;i<k;i++)
    {
        for(int j=0;j<=n;j++)
        {
            if(a[j-b[i]] && j-b[i]>=0)
            {
                if(a[j])a[j]=min(a[j],a[j-b[i]]+1);
                else a[j]=a[j-b[i]]+1;
            }
        }
    }
    cout<<a[n]-1;
    system("pause");
    return 0;
}
复制代码

简单题。。。。。。。。然后这一道题也是P1832 A+B Problem(再升级) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn),先学习一下简洁的写法:

复制代码
#include<bits/stdc++.h>
using namespace std;
int i,j,n;
long long dp[1001];
bool b[1001];
void prime()
{
    for(i=2;i<=500;i++)
        if(!b[i])
            for(j=2;i*j<=1000;j++)
                b[i*j]=1;
}
int main()
{    
    prime();
    cin>>n;
    dp[0]=1;
    for(i=2;i<=n;i++)
        if(!b[i])
        for(j=i;j<=n;j++)
            dp[j]+=dp[j-i];
    cout<<dp[n];
      return 0;
}
复制代码

 

然后再来说,发现问题了,在题解里面看到了佬,现在还是蒟蒻的我无法看懂,以后要努力变强:

 

posted @   工作日摆烂  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示