0
点赞
收藏
分享

微信扫一扫

1837:Balance

言午栩 2022-03-12 阅读 60
//动态规划
#include <iostream>
#include <cstring>
using namespace std;

int dp[21][15001];//状态数组,挂上前i个钩码后,达到j状态,的方法数

int main() {
	int i, j, k;
	int numc,numg;//挂钩数目,钩码数目
	int pos[21], weight[21];//挂钩位置,钩码重量

	cin >> numc >> numg;
	for (i = 1; i <= numc; i++)
		cin >> pos[i];
	for (i = 1; i <= numg; i++)
		cin >> weight[i];

	memset(dp, 0, sizeof(dp));//初始化为0
	dp[0][7500] = 1;//平衡状态,初始不放任何砝码,为1种方法

	for (i = 1; i <= numg; i++) {//依次遍历钩码
		for (j = 0; j <= 15000; j++) {
			if (dp[i - 1][j]) {//如果放入i-1个物品时状态j已出现,直接使用结果
				for (k = 1; k <= numc; k++) {//依次遍历挂钩位置
					dp[i][j + weight[i] * pos[k]] += dp[i - 1][j];//状态转移方程
				}
			}
		}
	}
	cout << dp[numg][7500] << endl;
	return 0;
}
举报

相关推荐

0 条评论