[UVALive 6661 Equal Sum Sets] (dfs 或 dp)

题意:

求从不超过 N 的正整数当中选取 K 个不同的数字,组成和为 S 的方法数。

1 <= N <= 20  1 <= K<= 10  1 <= S <= 155


解题思路:

  DFS:

  由于N,K,S的范围很小。直接DFS即可。

/*
ID: wuqi9395@126.com
PROG:
LANG: C++
*/
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<string>
#include<fstream>
#include<cstring>
#include<ctype.h>
#include<iostream>
#include<algorithm>
#define INF (1<<30)
#define PI acos(-1.0)
#define mem(a, b) memset(a, b, sizeof(a))
#define For(i, n) for (int i = 0; i < n; i++)
typedef long long ll;
using namespace std;
int n, k, s;
int cnt = 0;
void dfs(int sum, int x, int depth) {
    if (sum > s) return ;
    if (k - 1 == depth) {
        if (sum == s) cnt++;
        return ;
    }
    for (int i = x + 1; i <= min(n, s - sum); i++) dfs(sum + i, i, depth + 1);
}
int main () {
    while(scanf("%d%d%d", &n, &k, &s)) {
        if (n + k + s == 0) break;
        cnt = 0;
        for (int i = 1; i <= n; i++) {
            dfs(i, i, 0);
        }
        printf("%d\n", cnt);
    }
}


  DP:

  

dp[i][j][k] = dp[i - 1][j][k] + dp[i - 1][j - i][k - 1] //dp[i][j][k]表示从不超过i的数字中选取k个数和为j的方法数。

/*
ID: wuqi9395@126.com
PROG:
LANG: C++
*/
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<string>
#include<fstream>
#include<cstring>
#include<ctype.h>
#include<iostream>
#include<algorithm>
#define INF (1<<30)
#define PI acos(-1.0)
#define mem(a, b) memset(a, b, sizeof(a))
#define For(i, n) for (int i = 0; i < n; i++)
typedef long long ll;
using namespace std;
int dp[22][160][11];
int n, k, s;
int main () {
    dp[0][0][0] = 1;
    for (int i = 1; i <= 20; i++) {
        for (int j = 0; j <= 155; j++) {
            for (int k = 0; k <= 10; k++) {
                dp[i][j][k] = dp[i - 1][j][k];
                if (k > 0 && j >= i) dp[i][j][k] += dp[i - 1][j - i][k - 1];
            }
        }
    }
    while(scanf("%d%d%d", &n, &k, &s), n || k || s) printf("%d\n", dp[n][s][k]);
}


  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MATLAB中的isequal函数用于比较两个对象是否相等。该函数不考虑数据类型,只关注元素的值是否相等。当比较数值时,isequal函数不考虑数据类型,例如逻辑真和1、字母A和65,它们都视为相等。然而,不同的NaNs不相等,因此包含NaN的数组都不相等。如果想将NaN视为相等,可以使用isequalwithequalnans函数。对于元胞数组和结构体,isequal函数会循环比较它们的内容。如果所有元素的值都相等,则isequal函数返回逻辑1(真)。 在转化为C语言时,可以通过编写对应的代码来模拟isequal函数的运算。根据需要的功能,可以使用比较运算符(例如==)来比较数值,使用循环或递归来比较元胞数组和结构体的内容。同时,需要注意C语言和MATLAB的语法和数据类型的差异,确保代码的正确性和可移植性。 请注意,MATLAB中的isequal函数有一些特殊情况的处理,如对NaN的处理,以及对逻辑真和数值1的等价视为相等。在C语言中需要根据具体需求进行相应的处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [MATLAB中isequal函数转化为C语言,有项目算法使用matlab中isequal函数进行运算,这里需要将转化为C语言](https://download.csdn.net/download/li171049/88279963)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [MATLAB中的isequal函数的用法](https://blog.csdn.net/xuxinrk/article/details/80367911)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值