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();
	}
}
相关推荐
ゞ 正在缓冲99%…1 天前
leetcode2826.将三个组排序
算法·leetcode·动态规划
不知名。。。。。。。。1 天前
算法之动态规划
算法·动态规划
Miraitowa_cheems3 天前
LeetCode算法日记 - Day 84: 乘积为正数的最长子数组长度
数据结构·算法·leetcode·贪心算法·线性回归·深度优先·动态规划
鸽鸽程序猿4 天前
【算法】【动态规划】斐波那契数模型
算法·动态规划·1024程序员节
Brookty4 天前
【算法】前缀和(二)使用
java·学习·算法·前缀和·动态规划·1024程序员节
敲上瘾4 天前
背包dp——动态规划
c++·算法·动态规划
自在极意功。4 天前
动态规划核心原理与高级实战:从入门到精通(Java全解)
java·算法·动态规划·最优子结构·重叠子问题
nju_spy5 天前
力扣每日一题(三)划分题 + 思路题
数学·算法·leetcode·动态规划·笔试·记忆化搜索·状态压缩
闻缺陷则喜何志丹5 天前
【单调队列 多重背包】P1776 宝物筛选|普及+
c++·算法·动态规划·洛谷·多重背包·单调队列
熬了夜的程序员5 天前
【LeetCode】80. 删除有序数组中的重复项 II
java·数据结构·算法·leetcode·职场和发展·排序算法·动态规划