AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

AcWing 1371. 货币系统------一维写法和 二维写法和爆搜dfs(dfs不会优化)    原题链接    简单

作者: 作者的头像   会飞的泡泡 ,  2021-01-23 00:43:33 ,  所有人可见 ,  阅读 1047


11


3

附:完全背包问题板子题链接

点击进入完全背包链接
点击进入完全背包问题题解链接

一维

#include <iostream>
using namespace std;
const int maxn=10010;
int n,W;
int s[maxn];
long long  dp[maxn];// 方案数很大使用long long
int main(){
    cin>>n>>W;
    for(int i=1; i<=n; i++)cin>>s[i];
    dp[0]=1;//赋初值
    for(int i=1; i<=n; i++){
        for(int j=s[i]; j<=W; j++){
            dp[j]+=dp[j-s[i]];
        }
    }
    cout<<dp[W];
    return 0;
}

二维

#include <iostream>
using namespace std;
const int maxn=10010;
int n,W;
int s[maxn];
long long dp[30][maxn];//注意开dp[maxn][maxn]会runtime error
int main(){
    cin>>n>>W;
    for(int i=1; i<=n; i++)cin>>s[i];
    dp[1][0]=1; //只需要赋一个初值
    for(int i=1; i<=n; i++){
        for(int j=0; j<=W; j++){
            dp[i][j]+=dp[i-1][j];
            if(j>=s[i])dp[i][j]+=dp[i][j-s[i]];
        }
    }
    cout<<dp[n][W];
    return 0;
}

dfs,听说可以记忆化搜索,我不会。。
下面是爆搜代码会TLE

#include <iostream>
using namespace std;
const int maxn=10010;
int n,W;
int ans=0;//答案
int s[maxn];
void dfs(int index, int w){
    if(w==0){//递归边界
        ans++;
        return;
    }
    if(w<0||index>n){//递归边界
        return;
    }
    dfs(index, w-s[index]);//当前层搜索
    dfs(index+1, w);//下一层
}
int main(){
    cin>>n>>W;
    for(int i=1; i<=n; i++)cin>>s[i];
    dfs(1,W);
    cout<<ans;
    return 0;
}

1 评论


用户头像
万a   2024-03-27 22:52      1    踩      回复

记忆化搜索其实就是,将每次递归的结果 使用dfs参数作为下标存起来,然后遇到相同下标的时候将存起来的结果返回


App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息