01背包问题
  • 板块学术版
  • 楼主Qin_windlight
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/11/6 19:41
  • 上次更新2024/11/6 21:40:03
查看原帖
01背包问题
1490511
Qin_windlight楼主2024/11/6 19:41

https://www.luogu.com.cn/problem/P1509

// // Problem: 
// //     P1509 找啊找啊找GF
// //   
// // Contest: Luogu
// // URL: https://www.luogu.com.cn/problem/P1509
// // Memory Limit: 125 MB
// // Time Limit: 1000 ms
// // 
// // Powered by CP Editor (https://cpeditor.org)
// 
// // Problem: A. A+B Again?
// // Contest: Codeforces - Codeforces Round 964 (Div. 4)
// // URL: https://codeforces.com/contest/1999/problem/A
// // Memory Limit: 256 MB
// // Time Limit: 1000 ms
// // 
// // Powered by CP Editor (https://cpeditor.org)
// 
#include <bits/stdc++.h>

using namespace std;

struct Node {
	int rmb, rp, time;
} g[110];


int dp[110][110];
int dptime[110][110];
int n;

int main() {
	cin >> n;
	int m, r;
	
	for (int i=1;i<=n;i++) {
		cin >> g[i].rmb >> g[i].rp >> g[i].time;
	}

	cin >> m >> r;
	
	
	for (int i=1;i<=n;i++) {
		// rp
		for (int j=r;j>=g[i].rp;j--) {
			// rmb
			for (int k=m;k>=g[i].rmb;k--) {
				
				if (dp[j][k] < dp[j-g[i].rp][k-g[i].rmb] + 1){
					dp[j][k] = dp[j-g[i].rp][k-g[i].rmb]+1;
					dptime[j][k] = dptime[j-g[i].rp][k-g[i].rmb] + g[i].time;
				}
					
				else if(dp[j][k] == dp[j-g[i].rp][k-g[i].rmb] + 1) {
					dptime[j][k] = min( dptime[j][k], dptime[j-g[i].rp][k-g[i].rmb] + g[i].time );
				}
				
			}
		}
		
	}
	
	// // r 人品 m 钱
	// for (int i=0;i<=r;i++) {
		// for (int j=0;j<=m;j++) {
			// cout << dptime[i][j] << " ";
		// }
		// cout << endl;
	// }
	
	cout << dptime[r][m];
	
	
	return 0;
}

循环中为什么不能写成这样?

				dp[j][k] = max(dp[j][k], dp[j-g[i].rp][k-g[i].rmb]+1);
				dptime[j][k] = min( dptime[j][k], dptime[j-g[i].rp][k-g[i].rmb] + g[i].time );

为什么再在前面加上初始化也不行?

	for (int i=0;i<=r;i++) {
		for (int j=0;j<=m;j++) {
			dptime[i][j] = 1e9;
		}
	}
	
	dptime[0][0] = 0;
	

求解,是因为dp数组不可以还是因为dptime不可以

2024/11/6 19:41
加载中...