10:数字组合
2017-04-13 23:36
155 查看
描述
有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的不同的组合方式的数目。
样例输入
样例输出
思路:
此题目即为01背包问题,其中t相当于容量,用dp[i][j]表示前i个数组成j的方案数,可以发展状态转移方程;如果小于容量dp[i][j]=dp[i-1][j]+dp[i-1][j-a[i]]否则dp[i][j]=dp[i-1][j];注意初始条件下,当t为0时将f置为1,其余全部置为0,dp
[t]即为结果!
代码:
心得:
一开始没发现是01背包问题,要善于观察,仔细分析,就可发现,此问题就是于01背包问题!!!提高解决问题发现问题的能力!!
有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
思路:
此题目即为01背包问题,其中t相当于容量,用dp[i][j]表示前i个数组成j的方案数,可以发展状态转移方程;如果小于容量dp[i][j]=dp[i-1][j]+dp[i-1][j-a[i]]否则dp[i][j]=dp[i-1][j];注意初始条件下,当t为0时将f置为1,其余全部置为0,dp
[t]即为结果!
代码:
#include <bits/stdc++.h> using namespace std; int main() { int n, t; int a[21]; int dp[21][21]; cin >> n >> t; for (int i = 1; i <= n; i++) cin >> a[i]; for (int i = 0; i <= 20; i++) { for (int j = 0; j <= 20; j++) { dp[i][j] = 0; } } for (int i = 0; i <= n; i++) { dp[i][0] = 1; } for(int i=1;i<=n;i++) for (int j = 1; j <= t; j++) { if (j - a[i] >= 0) dp[i][j] = dp[i - 1][j] + dp[i - 1][j - a[i]]; else dp[i][j] = dp[i-1][j]; } cout << dp [t] << endl; return 0; }
心得:
一开始没发现是01背包问题,要善于观察,仔细分析,就可发现,此问题就是于01背包问题!!!提高解决问题发现问题的能力!!
相关文章推荐
- 10:数字组合
- 动态规划练习10:数字组合
- 随机给定10个小于10的数字(出现的数字可能重复),从其中取出3个各不相同的数字可组合出多个不同的3位数,请输出这些3位数中最大的那个3位数
- 随机给定10个小于10的数字(出现的数字可能重复),从其中取出3个各不相同的数字可组合出多个不同的3位数,请输出这些3位数中最大的那个3位数
- Java生成随机数字和字母组合10位数
- java循环练习:用户输入一个10以内的数字,通过运算求出该数字的阶乘
- PL/SQL语句学习之使用while、loop和for三种循环打印数字的1-10
- n全排列输出和 n个数的组合(数字范围a~b)
- php 从指定数字中获取随机组合的方法
- iso-开发基础知识-10-组合模式
- 10-重复出现的数字(map)
- 给定一个数N,求出1-N之间的数字有多少个1,例如N=11时结果为4(只有1,10,11含1)
- C语言的函数大全,参数列表,数字的8-10-16进制转换
- 【DFS】DLUToj-1215-组合数字
- 2014年去哪儿网笔试题--一个10*10的矩阵(可以理解为棋盘),随时生成一组数据填入矩阵,任何一个位置的数字除4进行计算,按余数着色...
- 5个数字任选3个组合
- 【学习笔记javascript设计模式与开发实践(组合模式)----10】
- 数字信号产生之含有高斯白噪声的正弦组合信号的产生
- 关于密码的正则表达式(6-16位数字和字母的组合)
- 如何得到指定数字中任意几个数字的组合