动态规划练习一 10:数字组合
2017-04-12 22:04
295 查看
描述
有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的不同的组合方式的数目。
样例输入
样例输出
这道题为递推问题,f[t]=f[t-a[i]](i>=0&&i<n),f[i]表示组成数i的不同的组合方式数目。
源代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{ int n,t,i,j,a[1001],f[1001]={1};
cin>>n>>t;
for(i=0;i<n;++i)
cin>>a[i];
for(i=0;i<n;++i)
for(j=t;j>=a[i];--j)
f[j]+=f[j-a[i]];
cout<<f[t]<<endl;
}
需要注意的是f[0]应初始化为1,即当t=a[i]的时候f[t]+1;还有第二重循环应从大到小循环,要是从小到大的话会有重复的情况。
有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
这道题为递推问题,f[t]=f[t-a[i]](i>=0&&i<n),f[i]表示组成数i的不同的组合方式数目。
源代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{ int n,t,i,j,a[1001],f[1001]={1};
cin>>n>>t;
for(i=0;i<n;++i)
cin>>a[i];
for(i=0;i<n;++i)
for(j=t;j>=a[i];--j)
f[j]+=f[j-a[i]];
cout<<f[t]<<endl;
}
需要注意的是f[0]应初始化为1,即当t=a[i]的时候f[t]+1;还有第二重循环应从大到小循环,要是从小到大的话会有重复的情况。
相关文章推荐
- 动态规划练习一 17:开餐馆
- 动态规划练习一 23:大盗阿福
- 动态规划练习--02(最大子矩阵)
- 动态规划练习一—2最大子矩阵
- 动态规划练习一 21题
- 动态规划练习一 三角形最佳路径问题
- 动态规划练习——最长上升子序列
- 动态规划练习02:最大子矩阵
- 动态规划练习--13(最大上升子序列和)
- 动态规划练习——最大上升子序列和
- 动态规划练习1--Unique Paths
- 算法练习笔记(十)——动态规划之回文子列的查找
- 最长公共子序列和回文字符串 动态规划 小白算法练习
- 编程练习-动态规划(最长公共子序列LCS)
- 数据结构与算法练习-动态规划
- 动态规划--LIS练习
- poj 1163-小白算法练习 The Triangle 动态规划
- 编程练习二(动态规划)
- 动态规划练习5
- 动态规划练习 8