社区讨论
请求加强数据
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
CPP2 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 条回复,欢迎继续交流。
正在加载回复...