2985_数字组合
来源:互联网 发布:压缩弹簧计算软件 编辑:程序博客网 时间:2024/06/16 06:54
/*Name: 2985_数字组合Copyright: Author: Date: 26-07-17 22:52Description: 2985_数字组合查看 提交 统计 提问总时间限制: 1000ms 内存限制: 65536kB描述有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 51 2 3 4 5样例输出3算法分析:这是一个典型的0-1背包问题,只不过不是求最优解,而是求所有可能的组合,故需要累计所有的组合。 */#include<iostream>using namespace std;const int MAXC = 10000; //背包最大容量 const int MAXN = 100; //物品的最大个数int V[MAXN+1];//第i个数的值相当于0-1背包中物品的重量和价值 long long F[MAXC+1] = {1}; //记录给定n个物品装入容量为j的背包的分配方案数量 long long ZeroOnePack_5(int n, int c);//可以转化为求0-1背包的方案总数int main() {int n, c;cin >> n >> c;for (int i=1; i<=n; i++)//不计下标为0的元素 {cin >> V[i];}cout << ZeroOnePack_5(n, c) << endl; return 0;}long long ZeroOnePack_5(int n, int c)//可以转化为求0-1背包的方案总数 { for (int i=1; i<=n; i++){//须先求出列坐标j较大的F[j],故让循环变量j的值从大到小递减for (int j=c; j>=V[i]; j--){//当(j < V[i])时,F[j]的值不变,即没有产生新的方案 F[j] += F[j-V[i]];}}return F[c];}
/*Name: 2985_数字组合Copyright: Author: Date: 26-07-17 22:52Description: 2985_数字组合查看 提交 统计 提问总时间限制: 1000ms 内存限制: 65536kB描述有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 51 2 3 4 5样例输出3算法分析:这是一个典型的0-1背包问题,只不过不是求最优解,而是求所有可能的组合,故需要累计所有的组合。*/#include<iostream>using namespace std;const int MAXC = 1000; //背包最大容量 const int MAXN = 20; //物品的最大个数int V[MAXN+1];//第i个数的值相当于0-1背包中物品的重量和价值 long long B3[MAXN+1][MAXC+1] = {1}; //记录给定n个物品装入容量为j的背包的分配方案数量int ZeroOnePack_3(int n, int c);//可以转化为求0-1背包的方案总数int main() {int n, c;cin >> n >> c;for (int i=1; i<=n; i++)//不计下标为0的元素 {cin >> V[i];}cout << ZeroOnePack_3(n, c) << endl; return 0;}int ZeroOnePack_3(int n, int c)//可以转化为求0-1背包的方案总数{ for (int i=1; i<=n; i++){for (int j=0; j<=c; j++) //注意j一定要从0开始 { B3[i][j] = B3[i-1][j];if (j >= V[i])//装物品i后,产生了新方案 B3[i][j] += B3[i-1][j-V[i]];}}return B3[n][c];}
/*Name: 2985_数字组合Copyright: Author: Date: 26-07-17 22:52Description: 2985_数字组合查看 提交 统计 提问总时间限制: 1000ms 内存限制: 65536kB描述有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 51 2 3 4 5样例输出3算法分析:这是一个典型的0-1背包问题,只不过不是求最优解,而是求所有可能的组合,故需要累计所有的组合。*/#include<iostream>using namespace std;const int MAXC = 10000; //背包最大容量 const int MAXN = 100; //物品的最大个数int V[MAXN+1];//第i个数的值相当于0-1背包中物品的重量和价值 long long B3[MAXN+1][MAXC+1] = {1}; //记录给定n个物品装入容量为j的背包的分配方案数量int ZeroOnePack_3(int n, int c);//可以转化为求0-1背包的方案总数int main() {int n, c;cin >> n >> c;for (int i=1; i<=n; i++)//不计下标为0的元素 {cin >> V[i];}cout << ZeroOnePack_3(n, c) << endl; return 0;}int ZeroOnePack_3(int n, int c)//可以转化为求0-1背包的方案总数{ for (int i=1; i<n; i++){ //注意j一定要从0开始 for (int j=0; j<V[i]; j++) //不能装入物品i,即没有产生新的组合方案 B3[i][j] = B3[i-1][j];for (int j=V[i]; j<=c; j++) //能装入物品i,即产生了新的组合方案 B3[i][j] = B3[i-1][j] + B3[i-1][j-V[i]];}B3[n][c] = B3[n-1][c];//不装物品n时的方案总数量 if (c >= V[n])//装物品n后,产生了新方案 B3[n][c] += B3[n-1][c-V[n]]; return B3[n][c];}
阅读全文
0 0
- 2985_数字组合
- java经典题目_数字组合
- 2985:数字组合
- Openjudge-noi 2985 数字组合
- 组合数字
- 数字组合
- 数字组合
- 数字组合
- 数字组合
- 数字组合
- 数字组合
- 数字组合
- 数字组合
- 数字组合
- 数字组合
- 数字组合
- 数字组合
- 数字组合
- git 常用命令
- ROM、RAM、DRAM、SRAM和FLASH的区别
- 如何使用阿里云虚拟主机搭建博客(三)设置篇
- Leetcode算法学习日志 -240 Search a 2D Matrix 2
- DATE_ADD() 与 DATE_SUB() 日期的加法与減法
- 2985_数字组合
- Android----------Recyclerview设置点击事件
- The Festive Evening map
- 引用---常引用型返回值
- 解决安装ros时出现的Depends: ros-indigo-simulators依赖问题
- 程序中的逻辑运算符:&&
- html中的表格元素
- 成为一名更好前端开发人员的9个技巧
- Linux Mint 18.2 gedit中文乱码问题