动态规划练习10:数字组合
2017-04-19 16:39
393 查看
题目简要:
描述有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的不同的组合方式的数目。样例输入
样例输出
解题思路:
这就是一个背包问题,如果能算出结果,方式就加一种。
附代码:
#include<bits/stdc++.h>
using namespace std;
int b[50];
int main()
{
int n,t;
while(cin>>n>>t)
{
int a[n+1];
b[0]=1;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)
{
for(int j=t;j>=a[i];j--)
b[j]+=b[j-a[i]];
}
cout<<b[n]<<endl;
}
return 0;
}
解题感受:
又练习了一下背包问题,其实这是看课件之后做得,自己对于背包问题还没有完全掌握,还需加强。
描述有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
解题思路:
这就是一个背包问题,如果能算出结果,方式就加一种。
附代码:
#include<bits/stdc++.h>
using namespace std;
int b[50];
int main()
{
int n,t;
while(cin>>n>>t)
{
int a[n+1];
b[0]=1;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)
{
for(int j=t;j>=a[i];j--)
b[j]+=b[j-a[i]];
}
cout<<b[n]<<endl;
}
return 0;
}
解题感受:
又练习了一下背包问题,其实这是看课件之后做得,自己对于背包问题还没有完全掌握,还需加强。
相关文章推荐
- Project Ruler 算法练习之 10 进制 转 2进制 以及数字对称
- SSD 590+直流数字驱动器手册(10)[声明:本人仅仅用来做翻译练习,同时对这个590+产品进行学习,对版权问题不承担责任]
- 递归与动态规划---数字字符串转换为字母组合的种数
- 吸血鬼数字,Java编程思想第四章练习10
- thinking in java test4.8练习(8)(9)(10)吸血鬼数字
- for循环的小练习之6个不重复数字的所有组合输出
- 编程练习:求和为指定数字的所有组合
- for循环的小练习之6个不重复数字的所有组合输出
- 使用动态规划解决有关数字组合的问题
- 随机给定10个小于10的数字(出现的数字可能重复),从其中取出3个各不相同的数字可组合出多个不同的3位数,请输出这些3位数中最大的那个3位数
- for循环的小练习之6个不重复数字的所有组合输出
- 【Java】 Thinking in Java 4.8 练习10 吸血鬼数字
- 使用动态规划解决有关数字组合的问题
- 随机给定10个小于10的数字(出现的数字可能重复),从其中取出3个各不相同的数字可组合出多个不同的3位数,请输出这些3位数中最大的那个3位数
- 10:数字组合
- java练习:打印 数字1、2、3、4的组合,不能以4开头,1和3不能相邻,且数字不能重复
- for循环的小练习之6个不重复数字的所有组合输出
- for循环的小练习之6个不重复数字的所有组合输出
- for循环的小练习之6个不重复数字的所有组合输出
- Linux_C练习:编写一个程序,求出满足下列条件的四位数:该数是个完全平方数,且第一、三位数字之和为10,第二、四位数字之积为12;