当前位置: 首页 > article >正文

AcWing 11 背包问题求方案数

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

#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();
	}
}


http://www.kler.cn/news/361001.html

相关文章:

  • 2024第四届中国RPA+AI开发者大赛圆满收官获奖名单公示
  • 小新学习Docker之Docker--harbor私有仓库部署与管理
  • Comsol 低频宽带排气消声器
  • 案例分析:拒绝服务攻击引发的网络调优之旅
  • blender分离含有多个动作的模型,并导出含有材质的fbx模型
  • 软件分享丨火绒应用商店
  • 【C++指南】类和对象(四):类的默认成员函数——全面剖析 : 拷贝构造函数
  • Leetcode 1857. 有向图中最大颜色值
  • Harmony OS 开发之ArkTS语言基础-类、接口、继承、模块、泛型
  • Vue Data UI——Vue 3 数据可视化组件库
  • 什么是堡垒机 ?
  • Nodes 节点
  • 时间序列预测(六)——循环神经网络(RNN)
  • 07 实战:视频捕获
  • 【系统架构设计师】专题:嵌入式系统考点梳理
  • 排序(1)
  • git的学习使用(认识工作区,暂存区,版本区。添加文件的方法)
  • RabbitMQ异常
  • PyTorch模型转换ONNX 入门
  • 24下河南秋季教资认定保姆级教程