AcWing 11 背包问题求方案数

代码写的字数比较多, 但是感觉还挺好理解的

cpp 复制代码
#include <bits/stdc++.h>
#define int long long

#define F(i, a, b) for (int i = (a); i <= (b); i++)
#define dF(i, a, b) for (int i = (a); i >= (b); i--)

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;

const int N = 1005, M = (N << 1), inf = 1e16, mod = 1e9 + 7;

int n, m, k, x, y, z, ans, t;
int v[N], w[N], f[N][N], f2[N][N];

void solve()
{
	cin >> n >> m;
	
	for (int i = 1; i <= n; i ++ )
	{
		cin >> v[i] >> w[i];
	}
	
	for (int i = 0; i <= m; i ++ )
	{
		f2[0][i] = 1;
	}
	
	for (int i = 1; i <= n; i ++ )
	{
		for (int j = m; j >= 0; j -- )
		{
			f[i][j] = f[i - 1][j];
			f2[i][j] = f2[i - 1][j];
			if (j < v[i]) continue;
			if (f[i][j] == f[i - 1][j - v[i]] + w[i])
			{
				f[i][j] = f[i - 1][j];
				f2[i][j] = (f2[i][j] + f2[i - 1][j - v[i]]) % mod;
			}
			else if (f[i][j] < f[i - 1][j - v[i]] + w[i])
			{
				f[i][j] = f[i - 1][j - v[i]] + w[i];
				f2[i][j] = f2[i - 1][j - v[i]];
			}
			else
			{
				f[i][j] = f[i - 1][j];
				f2[i][j] = f2[i - 1][j];
			}
		}
	}

	cout << f2[n][m] << endl;
}

signed main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int T = 1;
//	cin >> T;
	while (T -- )
	{
		solve();
	}
}
相关推荐
Logic10110 小时前
C语言/数据结构动态规划题解:Kadane算法求最大子数组和——O(n)时间O(1)空间
c语言·数据结构·动态规划·贪心·时间复杂度·算法题·最大子数组和
梦帮科技1 天前
AI 音乐产品的发布工程:验证门、数据发布、回滚与生产运维纪律
数据结构·数据库·架构·node.js·音视频·动态规划·推荐算法
语戚1 天前
力扣 1621. 大小为K的不重叠线段的数目:动态规划(Java 实现)
java·算法·leetcode·动态规划·力扣·dp
青山木1 天前
Hot 100 --- 最长有效括号
java·数据结构·算法·leetcode·动态规划
这料鬼有毒1 天前
二刷hot100-1143.最长公共子序列
算法·leetcode·动态规划
Tisfy2 天前
LeetCode 1477.找两个和为目标值且不重叠的子数组:滑动窗口 + 记录前值(动态规划)
动态规划·题解·dp·滑动窗口
ynchyong2 天前
动态规划解题思路:入门篇
动态规划
Tisfy3 天前
LeetCode 2472.不重叠回文子字符串的最大数目:动态规划(贪心)
动态规划·字符串·题解·贪心·dp·回文字符串
青山木4 天前
Hot 100 --- 最长递增子序列
java·数据结构·算法·leetcode·动态规划
Logic1015 天前
C语言/数据动态规划题解:翻转一次子数组后的最大子数组和——四状态DP(O(n)时间O(1)空间)
c语言·数据结构·动态规划·时间复杂度·算法题·状态机dp·最大子数组和