文章

68

粉丝

691

获赞

26

访问

575.6k

头像
路径还原,在dp时直接存储最优路径即可
P1567
发布于2020年5月29日 11:36
阅读数 10.3k

 

#define ll long long
#define vec vector<int>
#define inf 0x3f3f3f3f
#define MAX 1005
#define P pair<int,int>
#define MOD 1000000

int main() {
	int n, m, w[MAX], v[MAX], dp[MAX];
	while (cin >> m >> n) {
		memset(dp, 0, sizeof(dp));
		vec ve[MAX];
		for (int i = 1; i <= n; i++)cin >> w[i] >> v[i];
		for (int i = 1; i <= n; i++) {
			for (int j = m; j >= w[i]; j--)
				if (dp[j - w[i]] + v[i] > dp[j]) {
					dp[j] = dp[j - w[i]] + v[i];
					ve[j] = ve[j - w[i]];
					ve[j].push_back(i);
				}
		}
		cout << dp[m] << endl;
		if (dp[m] != 0) {
			for (int i = 0; i < ve[m].size(); i++)
				cout << ve[m][i] << ' ';
			cout << endl;
		}
	}
}

 

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发