动态规划:数字组合
2017-04-20 19:06
176 查看
描述
有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的不同的组合方式的数目。
样例输入
样例输出
题目要求从一堆数字里找出几个数字加起来等于某个数有几种选法;
思路如下:
1.dp[i][j]代表前i个数字和等于j的选法种类,a[i]代表第i个数;
2.j小于等于a[i]时,a[i]不能被选择,所以dp[i][j]=dp[i-1][j];
j大于a[i]时,a[i]可选可不选,所以dp[i][j]=dp[i-1][j]+dp[i-1][j-a[i]];
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int i,j,n,t,a[25],dp[25][1005]={0};
cin>>n>>t;
for(i=1;i<=n;i++)
{
cin>>a[i];
dp[i][a[i]]+=1; //这里注意因为只选择a[i]的状况不会被考虑到,所以要提前增一个
}
for(i=1;i<=n;i++)
{
for(j=1;j<=a[i];j++)
{
dp[i][j]+=dp[i-1][j];
}
for(j=a[i]+1;j<=t;j++)
{
dp[i][j]=dp[i-1][j]+dp[i-1][j-a[i]];
}
}
cout<<dp
[t]<<endl;
}
有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
题目要求从一堆数字里找出几个数字加起来等于某个数有几种选法;
思路如下:
1.dp[i][j]代表前i个数字和等于j的选法种类,a[i]代表第i个数;
2.j小于等于a[i]时,a[i]不能被选择,所以dp[i][j]=dp[i-1][j];
j大于a[i]时,a[i]可选可不选,所以dp[i][j]=dp[i-1][j]+dp[i-1][j-a[i]];
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int i,j,n,t,a[25],dp[25][1005]={0};
cin>>n>>t;
for(i=1;i<=n;i++)
{
cin>>a[i];
dp[i][a[i]]+=1; //这里注意因为只选择a[i]的状况不会被考虑到,所以要提前增一个
}
for(i=1;i<=n;i++)
{
for(j=1;j<=a[i];j++)
{
dp[i][j]+=dp[i-1][j];
}
for(j=a[i]+1;j<=t;j++)
{
dp[i][j]=dp[i-1][j]+dp[i-1][j-a[i]];
}
}
cout<<dp
[t]<<endl;
}
相关文章推荐
- 2985:数字组合(2.6基本算法之动态规划)
- 动态规划:砝码的组合方案(2018届校招C/C++软件开发工程师)
- 动态规划 数字三角形
- 动态规划----数字三角形
- 动态规划之数字三角形
- 动态规划--数字三角形
- 算法基础之python实现动态规划中数字三角形和最长上升子序列问题
- 动态规划解不包含相同数字的子串个数问题
- 动态规划--数字三角形问题
- 动态规划与排列组合
- 动态规划--(数字三角形 poj1163)
- 动态规划之组合求解
- 动态规划——求数字三角形最优解和最优路径
- 动态规划之数字三角形
- 动态规划0/1背包问题和数字三角形
- YTU.3134: 动态规划基础题目之数字三角形
- Java求解,输入两个整数n和m,从数列1,2,3,……n中随意取几个数,使其和等于m。要求将所有的可能组合列出来(背包动态规划问题求解)
- 动态规划--数字三角形
- POJ-1664 放苹果 动态规划思想解组合数学
- 动态规划:数字游戏