uva 10721 - Bar Codes(dp)

该博客主要分析了UVA 10721题目,讨论如何使用动态规划(DP)求解用k个1到m的数字组成n的不同方法数量。博主介绍了问题背景、解题思路,并强调了关键的递推公式cnt[i][j] = ∑(1 ≤ t ≤ min(k, j)) cnt[i - 1][t]。" 5291177,236165,Ubuntu开启3D桌面效果:CompizConfig设置管理器教程,"['Ubuntu', '图形界面', '桌面特效', 'Linux工具', '系统设置']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:uva 10721 - Bar Codes


题目大意:给出n,k和m,用k个1~m的数组成n,问有几种组成方法。


解题思路:简单dp,cnt[i][j]表示用i个数组成j, cnt[i][j] = ∑(1 ≤ t  ≤min(k, j)) cnt[i - 1][t].


#include <stdio.h>
#include <string.h>
#define ll long long
const int N = 105;

ll cnt[N][N];
int n, k, m;

void init() {
	memset(cnt, 0, sizeof(cnt));
	cnt[0][0] = 1;
}

void solve() {
	init();
	for (int i = 1; i <= k; i++) {
		for (int j = 1; j <= n; j++) {
			for (int t = 1;  t <= m && t <= j; t++)
				cnt[i][j] += cnt[i - 1][j - t];
		}
	}	
	printf("%lld\n", cnt[k][n]);
}

int main () {
	while (scanf("%d%d%d", &n, &k, &m) == 3) {
		solve();
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值