组合方式——动态规划

描述

有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

dp[0]一定要设置成1。

代码

#include<bits/stdc++.h>
using namespace std;

int num[30],dp[1005];

int main(){
	int n,t;
	cin>>n>>t;
	for(int i=0;i<n;i++){
		cin>>num[i];
	}
	dp[0]=1;
	for(int i=0;i<n;i++){
		for(int j=t;j>=num[i];j--){
			dp[j]+=dp[j-num[i]];
		}
	}
	cout << dp[t] <<endl;
	return 0;
}

1761:神奇的口袋(2)

总时间限制: 

1000ms

 

内存限制: 

65536kB

描述

有一个神奇的口袋,总的容积是400,用这个口袋可以变出一些物品,这些物品的总体积必须是400。John现在有n个想要得到的物品,每个物品的体积分别是a1,a2……an。John可以从这些物品中选择一些,如果选出的物体的总体积是400,那么利用这个神奇的口袋,John就可以得到这些物品。现在的问题是,John有多少种不同的选择物品的方式。

输入

输入的第一行是正整数n (1 <= n <= 200),表示不同的物品的数目。接下来的n行,每行有一个1到400之间的正整数,分别给出a1,a2……an的值。

输出

输出不同的选择物品的方式的数目对10000取模的结果(因为结果可能很大,为了避免高精度计算,只要求对10000取模的结果)。

样例输入

3
200
200
200

样例输出

3

代码

#include<iostream>
using namespace std;

int a[205],dp[405];
int n,sum=0;

int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	dp[0]=1;
	for(int i=0;i<n;i++){
		for(int j=400;j>=a[i];j--){
			dp[j]+=dp[j-a[i]];
			dp[j]%=10000;
		}
	}
	cout << dp[400] <<endl;
	return 0;
}

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TSP问题是一个经典的组合优化问题,它要求在给定的一组点之间找到一条最短的路径,使得每个点都被恰好访问一次。在这里,我将介绍如何使用动态规划算法来解决TSP问题。 动态规划算法是一种基于递推的算法,它将一个复杂的问题分解成简单的子问题,然后通过递推的方式来求解子问题的最优解,最终得到原问题的最优解。 对于TSP问题,我们可以使用动态规划算法来求解。具体来说,我们可以定义一个状态数组dp,其中dp[i][j]表示从起点出发经过点集i到达点j的最短路径长度。其中,点集i是指除了起点和终点之外的所有点的集合。 接下来,我们考虑如何计算dp[i][j]。对于任意一个点k,如果k不在点集i中,则可以忽略它对dp[i][j]的影响。如果k在点集i中,则可以将dp[i][j]表示为从起点出发经过点集i- {k}到达点k再到达点j的最短路径长度,即: dp[i][j] = min(dp[i-{k}][k] + dist[k][j]) 其中,dist[k][j]表示从点k到点j的距离。我们可以使用递推的方式从小到大依次计算dp数组的所有元素。最终,dp[all][0]就是TSP问题的最优解,其中all表示所有点的集合。 下面是使用Python实现TSP问题动态规划算法的代码: ``` import sys # DP-based TSP solver def tsp_dp(dist): n = len(dist) # dp[i][j] represents the shortest path starting from 0, visiting all nodes in i, and end at j dp = [[sys.maxsize] * n for i in range(1 << n)] dp[1][0] = 0 for i in range(1, 1 << n): for j in range(n): if i & (1 << j): for k in range(n): if i & (1 << k) and k != j: dp[i][j] = min(dp[i][j], dp[i ^ (1 << j)][k] + dist[k][j]) return dp[(1 << n) - 1][0] # Test case dist = [ [0, 1, 15, 6], [2, 0, 7, 3], [9, 6, 0, 12], [10, 4, 8, 0] ] print(tsp_dp(dist)) # Output: 21 ``` 在上面的代码中,我们使用了一个二进制数来表示点集i。具体来说,如果二进制数的第j位为1,则表示点j在点集i中。例如,二进制数1011表示点集{0, 1, 3}。 总之,动态规划算法是解决TSP问题的一种有效方法,它可以在较短的时间内求解出TSP问题的最优解。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值