Acwing2024蓝桥杯背包问题

AcWing 2. 01背包问题

cpp 复制代码
#include<iostream>
using namespace std;
const int N=1e3+5;
int n,m,volume[N],value[N],dp[N][N];
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>volume[i]>>value[i];
    for(int i=1;i<=n;i++){
        for(int j=0;j<=m;j++){
            dp[i][j]=dp[i-1][j];
            if(j>=volume[i]) dp[i][j]=max(dp[i-1][j],dp[i-1][j-volume[i]]+value[i]);
        }
    }
    cout<<dp[n][m]<<endl;
    return 0;
}

AcWing 3. 完全背包问题

cpp 复制代码
#include<iostream>
using namespace std;
const int N=1e3+5;
int n,m,volume[N],value[N],dp[N][N];
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>volume[i]>>value[i];
    for(int i=1;i<=n;i++){
        for(int j=0;j<=m;j++){
            dp[i][j]=dp[i-1][j];
            if(j>=volume[i]) dp[i][j]=max(dp[i-1][j],dp[i][j-volume[i]]+value[i]);
        }
    }
    cout<<dp[n][m]<<endl;
    return 0;
}

AcWing 1371. 货币系统

cpp 复制代码
#include<iostream>
using namespace std;
long long n,m,dp[30][10005],volume[30];
//dp[i][j]表示:只用前i种货币并且总钱数为j的所有方案数
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>volume[i];
    for(int i=0;i<=n;i++) dp[i][0]=1;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            dp[i][j]=dp[i-1][j];
            if(j>=volume[i]) dp[i][j]+=dp[i][j-volume[i]];
        }
    }
    cout<<dp[n][m]<<endl;
    return 0;
}

AcWing 1226. 包子凑数(第八届省赛)

cpp 复制代码
裴蜀定理:
若a,b是整数,且gcd(a,b)=d
那么对于任意的整数x,y,(ax+by)都一定是d的倍数
cpp 复制代码
如果这些数的gcd是d
那么他们的组合是d的倍数
如果d不是1
那么必然有无限个数无法被组合出来
cpp 复制代码
#include<iostream>
using namespace std;
int n,volume[105],ans;
bool dp[105][10005];
//dp[i][j]:用前i个笼子是否可以组成j个数目的包子
//最大公约数:
int gcd(int a,int b){
    return b?gcd(b,a%b):a;
}
int main(){
    cin>>n;
    int temp=0;
    for(int i=1;i<=n;i++){
        cin>>volume[i];
        temp=gcd(temp,volume[i]);
    }
    if(temp!=1) {puts("INF");return 0;}
    dp[0][0]=true;
    for(int i=1;i<=n;i++){
        for(int j=0;j<=10005;j++){
            dp[i][j]=dp[i-1][j];
            if(!dp[i][j]&&j>=volume[i]){
                dp[i][j]=dp[i][j-volume[i]];
            }
        }
    }
    for(int j=0;j<=10005;j++) if(!dp[n][j]) ans++;
    cout<<ans<<endl;
    return 0;
}

AcWing 3417. 砝码称重(第十二届省赛)

cpp 复制代码
#include<iostream>
using namespace std;
int n,volume[105],sum,ans;
bool dp[105][200005];
//dp[i][j]:用前i个砝码是否可以组成j,注意这里的j要开两倍(有绝对值)
int main(){
    cin>>n;
    for(int i=1;i<=n;i++) cin>>volume[i],sum+=volume[i];
    dp[0][0]=true;
    for(int i=1;i<=n;i++){
        for(int j=0;j<=sum;j++){
            dp[i][j]=dp[i-1][j]||dp[i-1][j+volume[i]]||dp[i-1][abs(j-volume[i])];
        }
    }
    for(int i=1;i<=sum;i++) if(dp[n][i]) ans++;
    cout<<ans<<endl;
    return 0;
}

AcWing 1234. 倍数问题(第九届省赛)

暴力法(超时未AC 60points):

cpp 复制代码
#include<iostream>
using namespace std;
const int N=1e5+5;
int n,m,a[N],ans;
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++)
        for(int j=i+1;j<=n;j++)
            for(int k=j+1;k<=n;k++)
                if((a[i]+a[j]+a[k])%m==0) ans=max(ans,a[i]+a[j]+a[k]);
    cout<<ans<<endl;
    return 0;
}
相关推荐
怀澈12223 分钟前
高性能服务器模型之Reactor(单线程版本)
linux·服务器·网络·c++
chnming19871 小时前
STL关联式容器之set
开发语言·c++
带多刺的玫瑰1 小时前
Leecode刷题C语言之统计不是特殊数字的数字数量
java·c语言·算法
爱敲代码的憨仔1 小时前
《线性代数的本质》
线性代数·算法·决策树
威桑1 小时前
MinGW 与 MSVC 的区别与联系及相关特性分析
c++·mingw·msvc
熬夜学编程的小王1 小时前
【C++篇】深度解析 C++ List 容器:底层设计与实现揭秘
开发语言·数据结构·c++·stl·list
yigan_Eins1 小时前
【数论】莫比乌斯函数及其反演
c++·经验分享·算法
Mr.131 小时前
什么是 C++ 中的初始化列表?它的作用是什么?初始化列表和在构造函数体内赋值有什么区别?
开发语言·c++
阿史大杯茶1 小时前
AtCoder Beginner Contest 381(ABCDEF 题)视频讲解
数据结构·c++·算法
C++忠实粉丝1 小时前
计算机网络socket编程(3)_UDP网络编程实现简单聊天室
linux·网络·c++·网络协议·计算机网络·udp