问个问题,先磕一个
  • 板块学术版
  • 楼主920106970146Y
  • 当前回复7
  • 已保存回复7
  • 发布时间2023/4/19 10:50
  • 上次更新2023/10/23 18:04:58
查看原帖
问个问题,先磕一个
475065
920106970146Y楼主2023/4/19 10:50

问题

为什么这个代码在,数据为1 1 0 0 4 8时,会出现给dp[负数]赋值为1。 还有为什么需要反过来算,正过来为什么会重复。

代码

#include<iostream>
using namespace std;
int n = 6, ans = 0, sum = 0;
int dp[1100], a[10] = { 0, 1, 2, 3, 5, 10, 20 }, b[200];
int main()
{
	fill(dp, dp + 1100, 0);
	for (int i = 1; i <= n; i++) cin >> b[i], sum += a[i] * b[i];
	dp[0] = 1;

	for (int i = 1; i <= n; i++) {
		for (int j = sum; j >= 0; j--) { //反着来,不然会重复
			for (int k = 1; k <= b[i]; k++) {
				if (dp[j - a[i] * k] == 1 and dp[j] == 0)
					dp[j] = 1, ans++, cout <<j<< ' ' << j-a[i]*k<<endl;
			}
		}
	}
	return 0;
}
2023/4/19 10:50
加载中...