动态规划 UVa 624 CD

本文解析了UVa624题目,该题为经典的0-1背包问题,通过C++实现并详细展示了如何使用动态规划解决,并记录物品选择路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题解释

链接: UVa 624
题目分析:这道题是基础的0-1背包问题,体积和价值是一样的。难点在于要打印路径。

源代码

#include <iostream>
#include <cstdio>
#include <stack>
#include <cstring>
using namespace std;

const int MAX = 10000;

int dp[MAX];
int v[MAX];
int w[MAX];
bool vis[22][MAX]; // track最多有20个,vis用于记录此步track有没有加进来

int max(int a, int b) { return (a > b) ? a : b;}

int main(int argc, char const *argv[])
{
	//freopen("in.txt", "r", stdin);
	int N, t;
	while(cin >> N)
	{
		cin >> t;
		for(int i = 1; i <= t; ++ i) 
		{
			cin >> v[i];
			w[i] = v[i]; // 体积v和重量w是一样的,实际上这句话没啥用
		}
		for(int j = 0; j <= N; ++ j)
			dp[j] = 0; // 初始化
		memset(vis, false, sizeof(vis));
		for(int i = 1; i <= t; ++ i)
		{
			for(int j = N; j >= v[i]; -- j)
			{
				int ans = dp[j - v[i]] + w[i];
				dp[j] = max(dp[j], ans);
				if (dp[j] == ans) {
					vis[i][j] = true; // 说明 i 加进来了
				}
			}
		}
		stack<int> s; // 结果是倒着的,所以用栈先保存一下
		int j = N;
		for(int i = t; i >= 0; -- i) {
			if(vis[i][j]) {
				s.push(v[i]);
				j = j - v[i];
			}
		}
		while(!s.empty()) {
			cout << s.top() << " ";
			s.pop();
		}
		cout << "sum:" << dp[N] << endl;
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值