数字组合(信息学奥赛一本通-1291)

【题目描述】

有n个正整数,找出其中和为t(t也是正整数)的可能的组合方式。如:n=5,5个数分别为1,2,3,4,5,t=5;那么可能的组合有5=1+4和5=2+3和5=5三种组合方式。

【输入】

输入的第一行是两个正整数n和t,用空格隔开,其中1≤n≤20,表示正整数的个数,t为要求的和(1≤t≤1000);接下来的一行是n个正整数,用空格隔开。

【输出】

和为t的不同的组合方式的数目。

【输入样例】

5 5

1 2 3 4 5

【输出样例】

3

【题解代码】

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

const int N = 1e3 + 10;
int dp[N], w[N];
int n, t;

int main()
{
	cin >> n >> t;
	for (int i = 1; i <= n; i++) cin >> w[i];

	dp[0] = 1;
	for (int i = 1; i <= n; i++)
	{
		for (int j = t; j >= 1; j--)
		{
			//dp[5] += dp[5-1] = 0 += dp[5-2] = 0 += dp[5-3] = 1 += dp[5-4] = 2 += dp[5-5] = 3
			//dp[4] += dp[4-1] = 0 += dp[4-2] = 0 += dp[4-3] = 1 += dp[4-4] = 2
			//dp[3] += dp[3-1] = 0 += dp[3-2] = 1 + dp[3-1] = 2
			//dp[2] += dp[2-1] = 0 += dp[2-2] = 1
			//dp[1] += dp[1-1] = 1
			dp[j] += dp[j - w[i]];  //选了w[i]的情况下,凑成j-w[i]的方案数有几个
		}
	}
	cout << dp[t];

	return 0;
}
相关推荐
橘子汽水1681 小时前
Leetcode 23,543合并K个升序链表,二叉树的直径
算法·leetcode·链表
huameinan狮子1 小时前
Adaboost算法原理与计算实例
算法
别怪我很水1 小时前
API中提供了VelocityTracker类用于计算触摸事件MotionEvent的速度,而其内部默认使用的方法就是最小二乘法,本 ...
算法·gitee·最小二乘法
Re.不晚4 小时前
挑战做100道力扣算法- DAY1
算法·leetcode·职场和发展
蓝悦无人机5 小时前
《Planning algorithms》读书笔记——第1章 引言
算法·读书笔记·规划算法·lavalle
Sagittarius_A*5 小时前
分组密码基础(二):Feistel 结构与 DES 的设计思想
算法·信息安全·密码学·des·数论
青山木5 小时前
Hot 100 --- 搜索插入位置
java·数据结构·算法·leetcode
alexwang2116 小时前
HDU 4348 详细题解
c++·算法·题解·hdu·主席树·可持久化数据结构·可持久化线段树
可编程芯片开发6 小时前
基于分段变步长搜索RMDCFT算法的天基雷达空间机动目标检测方法MATLAB仿真,对比RMDCFT算法
算法