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();
	}
}
相关推荐
xsyaaaan4 小时前
代码随想录Day30动态规划:背包问题二维_背包问题一维_416分割等和子集
算法·动态规划
我是咸鱼不闲呀7 小时前
力扣Hot100系列19(Java)——[动态规划]总结(上)(爬楼梯,杨辉三角,打家劫舍,完全平方数,零钱兑换)
java·leetcode·动态规划
xhbaitxl11 小时前
算法学习day39-动态规划
学习·算法·动态规划
xhbaitxl13 小时前
算法学习day38-动态规划
学习·算法·动态规划
2501_924878731 天前
数据智能驱动进化:AdAgent 多触点归因与自我学习机制详解
人工智能·逻辑回归·动态规划
YYuCChi2 天前
代码随想录算法训练营第三十七天 | 52.携带研究材料(卡码网)、518.零钱兑换||、377.组合总和IV、57.爬楼梯(卡码网)
算法·动态规划
罗湖老棍子2 天前
括号配对(信息学奥赛一本通- P1572)
算法·动态规划·区间dp·字符串匹配·区间动态规划
一只小小的芙厨2 天前
寒假集训笔记·树上背包
c++·笔记·算法·动态规划
金融RPA机器人丨实在智能2 天前
2026动态规划新风向:实在智能Agent如何以自适应逻辑重构企业效率?
算法·ai·重构·动态规划
问好眼2 天前
【信息学奥赛一本通】1275:【例9.19】乘积最大
c++·算法·动态规划·信息学奥赛