Homework Introduction

/*
针对第i个游戏机
f[j]预算为j元的时候的最大价值
tmp[j]前i-1个
for(int i=cost;i<=m;i++){
	f[j] = tmp[j-cost]
}
for(int i=1;i<=tot;i++){
	x价格,y价值
	for(int j=m;j>=x;j--){
		f[j] = max(f[j],f[j-x]+y);
	}
}
for(int i=1;i<=m;i++)f[i] = max(f[i],tmp[i])
*/
#include <bits/stdc++.h>
using namespace std;
const int N = 55;
int n, m, f[1000005], tmp[1000005];

int main() {
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		int cost, tot;
		cin >> cost >> tot;
		memset(f, 0xcf, sizeof(f));
		for (int j = cost; j <= m; j++)
			f[j] = tmp[j - cost];
		while (tot--) {
			int x, y;
			cin >> x >> y;
			for (int j = m; j >= x; j--) {
				f[j] = max(f[j], f[j - x] + y);
			}
		}
		for (int j = 0; j <= m; j++) {
			f[j] = max(f[j], tmp[j]);
			tmp[j] = f[j];
		}
	}
	cout << f[m] << endl;
	return 0;
}
/*
h[i]第i个方块的高度
a[i]第i个方块的最大高度
c[i]第i个方块的数量

先放限制高度低的
*/
#include <bits/stdc++.h>
using namespace std;
const int N = 4005;
struct node {
	int c, v;
} p[N];
int n, f[1000005];

bool cmp(node a, node b) {
	return a.v < b.v;
}

int main() {
	cin >> n;
	int cnt = 0;
	for (int i = 1; i <= n; i++) {
		int x, y, z;
		cin >> x >> y >> z;
		for (int j = 1; j <= z; j *= 2) {
			p[++cnt].v = y;
			p[cnt].c = j * x;
			z -= j;
		}
		if (z) {
			p[++cnt].v = y;
			p[cnt].c = z * x;
		}
	}
	sort(p + 1, p + cnt + 1, cmp);
	int res = 0;
	for (int i = 1; i <= cnt; i++) {
		for (int j = p[i].v; j >= p[i].c; j--) {
			f[j] = max(f[j], f[j - p[i].c] + p[i].c);
			res = max(res, f[j]);
		}
	}
	cout << res << endl;
	return 0;
}
/*
f[j]派出j名士兵的最大价值
f[j] = max(f[j],f[j-2*a[i]]+i)
*/
#include <bits/stdc++.h>
using namespace std;
const int N = 105;
int s, n, m;
int a[105][105];
int f[20005];

int main() {
	cin >> s >> n >> m;
	for (int i = 1; i <= s; i++) {
		for (int j = 1; j <= n; j++) {
			cin >> a[j][i];
		}
	}
	for (int i = 1; i <= n; i++) {
		sort(a[i] + 1, a[i] + s + 1);
	}
	for (int i = 1; i <= n; i++) {
		for (int j = m; j >= 0; j--) {
			for (int k = 1; k <= s; k++) {
				if (j > 2 * a[i][k]) {
					f[j] = max(f[j], f[j - 2 * a[i][k] - 1] + k * i);
				}
			}
		}
	}
	cout << f[m] << endl;
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 5005;
int n, m, f[N];
vector<int>e[N];
int w[N], a[N];

int dfs(int x) {
	//x点有一个棋子的最大游戏次数
	if (f[x])
		return f[x];
	int dp[N];
	memset(dp, 0, sizeof(dp));
	for (auto v : e[x]) {
		if (w[v] < w[x]) {
			int c = dfs(v);
			for (int j = w[x] - 1; j >= w[v]; j--) {
				dp[j] = max(dp[j], dp[j - w[v]] + c);
			}
		}
	}
	f[x] = dp[w[x] - 1] + 1;
	return f[x];
}

signed main() {
	cin >> n >> m;
	for (int i = 1; i <= m; i++) {
		int x, y;
		cin >> x >> y;
		e[x].push_back(y);
		e[y].push_back(x);
	}
	for (int i = 1; i <= n; i++)
		cin >> w[i];
	for (int i = 1; i <= n; i++)
		cin >> a[i];
	for (int i = 1; i <= n; i++) {
		if (!f[i]) {
			int c = dfs(i);
		}
	}
	int res = 0;
	for (int i = 1; i <= n; i++) {
		res += f[i] * a[i];
	}
	cout << res << endl;
	return 0;
}
#include <bits/stdc++.h>
using namespace std;

struct node {
	int v, c;
} p[3005];
int n, f[6005], m;

bool cmp(node a, node b) {
	return a.v < b.v;
}

int main() {
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		cin >> p[i].v >> p[i].c;
	}
	sort(p + 1, p + n + 1, cmp);
	int res = 0;
	for (int i = 1; i <= n; i++) {
		for (int j = m + p[i].v - 1; j >= p[i].v; j--) {
			f[j] = max(f[j], f[j - p[i].v] + p[i].c);
			res = max(res, f[j]);
		}
	}
	cout << res << endl;
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1025;
int n, m, v[N], c[N], t[N], f[N][N];
int fa[N];
int g;
vector<int> e[N];
signed main() {
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        cin >> t[i] >> c[i] >> v[i];
        if (t[i] == 0)
            t[i] = m / v[i] + 10;
    }
    memset(fa, -1, sizeof(fa));
    int g;
    cin >> g;
    int cnt = 0;
    for (int i = 1; i <= g; i++) {
        int T;
        cin >> T;
        for (int j = 1; j <= T; j++) {
            int x;
            cin >> x;
            fa[x] = i;
            cnt = i;
        }
    }
    for (int i = 1; i <= n; i++) {
        if (fa[i] == -1)
            e[++cnt].push_back(i);
        else {
            e[fa[i]].push_back(i);
        }
    }
    for (int i = 0; i <= n; i++) {
        for (int j = 0; j <= m; j++) f[i][j] = -1e9;
    }
    f[0][0] = 0;
    for (int i = 1; i <= cnt; i++) {
        for (int j = 0; j <= m; j++) f[i][j] = f[i - 1][j];
        for (int j = 0; j <= m; j++) {
            for (auto V : e[i]) {
                for (int k = 0; k <= t[V]; k++) {
                    if (j >= k * v[V]) {
                        if (f[i - 1][j - k * v[V]] != -1e9)
                            f[i][j] = max(f[i][j], f[i - 1][j - k * v[V]] + k * c[V]);
                    }
                }
            }
        }
        for (int j = 0; j <= m; j++) {
            f[i][j] = max(f[i][j], f[i - 1][j]);
        }
    }
    if (f[cnt][m] != -1e9)
        cout << f[cnt][m] << endl;
    else
        cout << "i'm sorry..." << endl;
    return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 605;
int n, m, f[32005], v[N], c[N], a[N], b[N], t[N];
vector<int>e[N];

int main() {
	cin >> m >> n;
	for (int i = 1; i <= n; i++) {
		int x;
		cin >> v[i] >> c[i] >> x;
		if (x != 0) {
			e[x].push_back(i);
		}
		c[i] = v[i]*c[i];
		t[i] = x;
	}
	for(int i=1;i<=n;i++){
		for(int j=m;j>=0;j--){
			if(t[i]==0){
				//1.主件
				if(j>=v[i])
					f[j] = max(f[j],f[j-v[i]]+c[i]);
				//2.主件+附件1
				if(e[i].size()>=1){
					if(j>=v[i]+v[e[i][0]]){
						f[j] = max(f[j],f[j-v[i]-v[e[i][0]]]+c[i]+c[e[i][0]]);
					}
				}
				//3.主件+附件2
				if(e[i].size()>=2){
					if(j>=v[i]+v[e[i][1]]){
						f[j] = max(f[j],f[j-v[i]-v[e[i][1]]]+c[i]+c[e[i][1]]);
					}
					if(j>=v[i]+v[e[i][0]]+v[e[i][1]]){
						f[j] = max(f[j],f[j-v[i]-v[e[i][0]]-v[e[i][1]]]+c[i]+c[e[i][0]]+c[e[i][1]]);
					}
				}
			}
		}
	}
	cout << f[m] << endl;
	return 0;
}
Status
Done
Problem
22
Open Since
2025-12-18 0:00
Deadline
2026-2-28 23:59
Extension
24 hour(s)