2 solutions
- 1
Information
- ID
- 1156
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- 8
- Tags
- # Submissions
- 20
- Accepted
- 6
- Uploaded By
非常经典的一道分组背包问题,比较要注意的是组内互斥不要忘了,板子题
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
typedef pair<int, int> PII;
const int mod = 1e9 + 7, MOD = 998244353;
const int N = 65, inf = 0x3f3f3f3f, INF = 0x3f3f3f3f3f3f3f3f;
int n, m, dp[32005];
int w[N], val[N];
bool king[N];
vector<int> h[N];
signed main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> m >> n;
int c, bel;
for (int i = 1; i <= n; i++)
{
cin >> w[i] >> c >> bel;
val[i] = w[i] * c;
if (!bel)
king[i] = true;
else
h[bel].emplace_back(i);
}
for (int i = 1; i <= n; i++)
if (king[i])
for (int j = m; j; j--)
{
if (j >= w[i])
dp[j] = max(dp[j], dp[j - w[i]] + val[i]);
if (h[i].size() == 2)
{
int _w = w[i] + w[h[i][0]] + w[h[i][1]];
if (j >= _w)
dp[j] = max(dp[j],
dp[j - _w] + val[i] + val[h[i][0]] + val[h[i][1]]);
}
for (int it : h[i])
{
if (j >= w[i] + w[it])
dp[j] = max(dp[j], dp[j - w[i] - w[it]] + val[i] + val[it]);
}
}
cout << dp[m];
return 0;
}
#include<bits/stdc++.h> using namespace std; const int N=35000; int dp[N];
struct point{
int v1,v2,v3;
int s1,s2,s3; }p[N];
int main() {
int i,j,n,m,v,nums,q;
cin>>n>>m;
for(i=1;i<=m;i++){
cin>>v>>q>>nums;
if(nums==0){
p[i].v1=v;
p[i].s1=v*q;
}
else{
if(p[nums].v2==0){
p[nums].v2=v;
p[nums].s2=v*q;
}
else{
p[nums].v3=v;
p[nums].s3=v*q;
}
}
} for(i=1;i<=m;i++){
for(j=n;j>=1;j--){
if(p[i].v1<=j){
dp[j]=max(dp[j],dp[j-p[i].v1]+p[i].s1);
}
if(p[i].v1+p[i].v2<=j){
dp[j]=max(dp[j],dp[j-p[i].v1-p[i].v2]+p[i].s1+p[i].s2);
}
if(p[i].v1+p[i].v3<=j){
dp[j]=max(dp[j],dp[j-p[i].v1-p[i].v3]+p[i].s1+p[i].s3);
}
if(p[i].v1+p[i].v2+p[i].v3<=j){
dp[j]=max(dp[j],dp[j-p[i].v1-p[i].v2-p[i].v3]+p[i].s1+p[i].s2+p[i].s3);
}
}
}
cout<<dp[n]; return 0; }
By signing up a 追梦算法网 universal account, you can submit code and join discussions in all online judging services provided by us.