从N块长度各不相同的积木中找出K块,使它们的长度和为S,一共有多少种不同的方案?
2014-03-19 18:50
232 查看
从头开始学DP,说多了都是泪。
————————————————————————————————————————————————————
【输入格式要求】
输入包含一组测试数据。第一行为三个整数N、K和S,表示有N块积木,要求选出K块,使它们的
长度和为S。第二行为N个互不相同的正整数。
【输出格式要求】
一个整数,表示不同方案总数。
【输入样例】
3 2 4
1 2 3
【输出样例】
1
————————————————————————————————————————————————————
只想出了三维的解决办法,不知道怎么压缩成二维
如果有简单一些的办法或者发现我的答案有错,请多多指教
————————————————————————————————————————————————————
————————————————————————————————————————————————————
【输入格式要求】
输入包含一组测试数据。第一行为三个整数N、K和S,表示有N块积木,要求选出K块,使它们的
长度和为S。第二行为N个互不相同的正整数。
【输出格式要求】
一个整数,表示不同方案总数。
【输入样例】
3 2 4
1 2 3
【输出样例】
1
————————————————————————————————————————————————————
只想出了三维的解决办法,不知道怎么压缩成二维
如果有简单一些的办法或者发现我的答案有错,请多多指教
————————————————————————————————————————————————————
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <queue> #include <vector> #include <set> #include <stack> #include <time.h> using namespace std; typedef long long LL; const int INF = 0x3f3f3f3f; const int N = 105; const int M = 105; int a ; int dp ;//代表前i个积木选j个长度为k有多少种 int main() { int n, K, s; scanf("%d %d %d", &n, &K, &s); for(int i = 1; i <= n; i++) scanf("%d", &a[i]); dp[0][0][0] = 1; int ans = 0; for(int i = 1; i <= n; i++){ dp[i][0][0] = 1; for(int j = 1; j <= i; j++){ //ans+=a[i]; //dp[i][i][ans] = 1; for(int k = 1; k <= s; k++){ dp[i][j][k] += dp[i-1][j][k];//不选 //是使用赋值还是+=???不确定 if(k >= a[i]) dp[i][j][k] += dp[i-1][j-1][k-a[i]];//如果选a[i] } } } for(int i = 1; i <= n; i++){ for(int j = 1; j <= i; j++){ // dp[i][j][0] = 1; for(int k = 1; k <= s; k++){ printf("dp[%d][%d][%d] = %d\n", i, j, k, dp[i][j][k]); } } } cout<<dp [K][s]<<endl; return 0; }
相关文章推荐
- 小明买了一些彩色的气球用绳子串在一条线上,想要装饰房间,每个气球都染上了一种颜色,每个气球的形状都是各不相同的。我们用1到9一共9个数字表示不同的颜色,如12345则表示一串5个颜色各不相同的气球串。但小明希望得到不出现重复颜色的气球串,那么现在小明需要将这个气球串剪成多个较短的气球串,小明一共有多少种剪法?如原气球串12345的一种是剪法是剪成12和345两个气球串。
- poj 2409 Let it Bead 一串由n个珠子组成的项链用c种颜色染,旋转/翻转算一种方案,问一共有多少种不同的染色方案
- 编程找出不同的四位平方数对,它们由相同的数字构成
- java里如何实现两个等长度的字符串数组有多少个元素相同(从最左边开始,一旦遇到不同元素则跳出计数)
- n!一共有多少位长度
- 小易邀请你玩一个数字游戏,小易给你一系列的整数。你们俩使用这些整数玩游戏。每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字。 例如: 如果{2,1,2,7}是你有的一系列数,小易说的数字是11.你可以得到方案2+2+7 = 11.如果顽皮的小易想坑你,他说的数字是6,那么你没有办法拼凑出和为6 现在小易给你n个数,让你找出无法从n个数中选取部分求和
- 一共有12个球,其中一个的重量与其他11个球不同。现在你有一个天平,并有3次机会(仅有3次),试着找出这个重量不同的球
- mysql两个表结构相同,如何找出它们的不同记录方法[left join].
- 今天和群友谈论了有多少个API获取字符长度的,一共列举出15个
- Hdu 5807 Keep In Touch(有三个人分别在三个位置,每一秒各走一步,三个城市可以联络的要求是两两权值差小于等于K。 问有多少种不同的方案,让这三个人可以联络。)
- LeetCode 96. Unique Binary Search Trees Python Solution, Catalan数 结点数为n的不同形态的二叉树一共有多少种
- 给定一个英文原文,统计文件里面一共有多少个不同的英文单词
- 有序表和无序表分别进行顺序查找,对于查找失败的情况下,它们的平均查找长度是不同的
- 给定一个英文原文,统计文件里面一共有多少个不同的英文单词
- 用n种颜色给正方体着色共用多少种不同的着色方案
- r个有标志的球放进n个不同的盒子里,要求无一空盒,问有多少种不同的分配方案?
- 第39级台阶 每一步只能迈上1个或2个台阶.先迈左脚,然后左右交替,最后一步是迈右脚,也就是说一共要走偶数步.那么,上完39级台阶,有多少种不同的上法(java代码)
- 有 N 个非零且各不相同的整数。请你编一个程序求出它们中有多少对相反数(a 和 -a 为一对相反数)。
- 在一个长度为n的不同元素的数组中顺序查找元素x,查找成功时的平均比较次数为多少
- 给定一个英文原文,统计文件里面一共有多少个不同的英文单词