装背包的方案数

欢迎访问我的博客首页


背包问题求方案数

1. 背包问题方案数


  简单背包问题只考虑体积。
  题目来自 牛客网:小 Q 有 X 首长度为 A 的不同的歌和 Y 首长度为 B 的不同的歌,现在小 Q 想用这些歌组成一个总长度正好为 K 的歌单,每首歌最多只能在歌单中出现一次,在不考虑歌单内歌曲的先后顺序的情况下,请问有多少种组成歌单的方法。

#include<iostream>
#include<vector>
using namespace std;

int simple_package(vector<int>& volumes, int capacity) {
	if (volumes.size() == 0 || capacity <= 0)
		return 0;
	const int mod = 1000000007;

	vector<vector<int>> dp(capacity + 1, vector<int>(volumes.size()));
	// 1.计算dp[0][0]:把体积为0的物体放入容积为0的容器中的放法为1。
	dp[0][0] = 1;
	// 2.计算dp[1:][0]:把体积为volumes[0]的物体放入容积为volumes[0]的容器中的放法为1。
	for (int i = 1; i <= capacity; i++)
		dp[i][0] = i == volumes[0] ? 1 : 0;
	// 3.计算dp[:][1:]。
	for (int i = 0; i <= capacity; i++)
		for (int j = 1; j < volumes.size(); j++) {
			if (volumes[j] <= i)
				dp[i][j] = (dp[i - volumes[j]][j - 1] + dp[i][j - 1]) % mod;
			else
				dp[i][j] = dp[i][j - 1];
		}
	return dp[capacity][volumes.size() - 1];
}
// dp[i][j]=x:把volumes[0:j]这j+1个物体放入容积为i的容器中的方法共有x种。

int main() {
	int simple_package(vector<int>& volumes, int capacity);
	int a, x, b, y, k;
	cin >> k >> a >> x >> b >> y;
	vector<int> volumes;
	for (int i = 1; i <= x; i++)
		volumes.push_back(a);
	for (int i = x + 1; i <= x + y; i++)
		volumes.push_back(b);
	cout << simple_package(volumes, k) << endl;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值