社区讨论

请求加强数据

P1782旅行商的背包参与者 3已保存回复 6

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@lo1gixcs
此快照首次捕获于
2023/10/22 20:40
2 年前
此快照最后确认于
2023/11/02 21:05
2 年前
查看原帖
学习最优解的时候发现一个问题
考虑完全背包优化时,只用更新 dp[C]=min(dp[C], dp[C-v]+w) 都可以过!(不用枚举背包容量)
以下 Hack
CPP
2 0 10
1 2 12
2 2 4
这个就过不了(最优解做法
CPP
#include<iostream>
#define int long long 
#define max(a,b) a>b?a:b
using namespace std;
int v,w,d,n,m,c;
int f[10001];

signed main()
{
    cin >> n >> m >> c;
	for(int i(1);i<=n;++i)
	{
		cin >> v >> w >> d;
		if(v*d>c)
			for(int j(c);j<=c;++j)
				f[j]=max(f[j],f[j-v]+w);
		else
		{
			for(int j=1;j<=d;j*=2)
			{
				for(int k=c;k>=v*j;--k)
					f[k]=max(f[k],f[k-v*j]+j*w);
				d-=j;
			}
			if(d>=0)
				for(int j=c;j>=d*v;--j)
					f[j]=max(f[j],f[j-v*d]+w*d);
		}
	}
	for(int i=1;i<=m;++i)
    {
        cin >> v >> w >> d;
        for(int j=c;j>=0;--j)
            for(int k=0;k<=j;++k)
                f[j]=max(f[j],f[j-k]+k*(v*k+w)+d);
    }
    cout << f[c];
	return 0;
}
这个正常做法就可以过
CPP
//Need O2 BIN+完全优化 
#include <bits/stdc++.h>
#define rint register int
#define int long long
using namespace std;

int N, M, C;
int V, W, D;
int a, b, c;
int dp[10005], v, w;
int cnt=0;

signed main () {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	cin >> N >> M >> C;
	for (rint i=1; i<=N; ++i) {
		cin >> V >> W >> D;
		if (V*D<C) {
			for (rint j=1; j<=D; D-=j, j<<=1) {
				w=W*j, v=V*j;
				for (rint j=C; j>=v; --j)
					dp[j]=max(dp[j], dp[j-v]+w);
			}
			if (D) {
				w=W*D, v=V*D;
				for (rint j=C; j>=v; --j)
					dp[j]=max(dp[j], dp[j-v]+w);
			}
		} else  //特判完全背包存在性 
			for (rint j=V; j<=C; ++j)
				dp[j]=max(dp[j], dp[j-V]+W);
	}
	for (rint i=1; i<=M; ++i) {
		cin >> a >> b >> c;
		for (rint k=C; k>=0; --k)
			for (rint j=0; j<=k; ++j) 
				dp[k]=max(dp[k], dp[k-j]+1ll*a*j*j+b*j+c);
	} 
	cout << dp[C] << endl;
	return 0;
}

回复

6 条回复,欢迎继续交流。

正在加载回复...