2985_数字组合

/*
	Name: 2985_数字组合
	Copyright: 
	Author: 
	Date: 26-07-17 22:52
	Description: 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 5
1 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:52
	Description: 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 5
1 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:52
	Description: 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 5
1 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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 你可以使用质因数分解的方法来解决这个问题。首先,你可以把 N 分解成质因数的乘积。例如,如果 N=24,你可以得到 N=2*2*2*3。然后,你可以遍历每个质因数,找到 p 和 q。例如,在上面的例子中,p=2 和 q=3。 如果你有 T 个测试用例,你可以对每个测试用例重复上述步骤,并输出 p 和 q 的值。 在计算机科学中,这个问题被称为“质因数分解”。这是一种非常常见的问题,在许多应用中都有用处。 ### 回答2: 对于每个测试用例,我们需要找到两个不同的质数 p 和 q,使得 N=p^2*q。 首先,我们可以使用一个函数来判断一个数字是否为质数。质数是只能被1和自身整除的数。我们可以从2开始,一直到这个数字的平方根,检查是否存在能够整除它的数。 接下来,对于每个测试用例: 1. 首先,我们初始化 p 和 q 为0,并从2开始递增。 2. 对于每个数字 i,我们首先检查它是否为质数。如果是质数,那么我们将 p 更新为 i。 3. 检查 N/p^2 是否为质数。如果是质数,我们将 q 更新为 N/p^2,并结束循环。 4. 如果我们没有找到合适的 p 和 q,那么我们继续增加 i 的值,重复步骤2和3,直到找到合适的 p 和 q。 最后,我们输出找到的 p 和 q。 注意:在实际代码实现中,我们还需要考虑错误处理和优化算法的效率。上述步骤仅为一种解决该问题的思路。 ### 回答3: 要找出 p 和 q,我们需要对 N 进行因式分解。根据题目的条件,N=p^2*q,其中 p 和 q 是两个不同的质数。 首先,我们可以遍历可能的 p 的值,从 2 开始,一直到 sqrt(N)。对于每个 p 的值,我们可以计算出 q = N / (p^2) 的值。 然后,我们需要判断 p 和 q 是否都是质数。为了判断一个数是否为质数,我们可以从 2 开始,一直到 sqrt(p) 或 sqrt(q),检查这些数是否是 p 或 q 的因子。如果找到了任何因子,那么 p 或 q 不是质数。如果没有找到因子,那么 p 和 q 都是质数。 最后,我们还需要确保 p 和 q 是不同的质数。所以,在计算出 q 的值后,我们需要比较 p 和 q 是否相等,如果相等,则尝试下一个 p 的值。 使用上述方法,我们可以解决 T 个测试用例,找出每个 N 对应的 p 和 q。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值