Grace25 @ 2020-10-31 16:21:16
想直接用有依赖的背包问题的解法做(附件有不止2个)。。。但是全WA了。。。
话说我写这么多循环都没TIE
#include<iostream>
#include<algorithm>
using namespace std;
int n,s,m=1,dp[1010],dp_f[1010][1010];
struct thing{
int v,w,h;
}main_item[1010],annex_item[110][110];
int main(){
int v,w,h;
cin >> s >> n;
for(int i=1;i<=n;i++){
cin >> w >> v >> h;
if (!h){//是主件
main_item[0].h++;//件数加一
main_item[main_item[0].h].v = v*w;//储存
main_item[main_item[0].h].w = w;
}else{//是附件
annex_item[h][0].h++;//件数加一
annex_item[h][annex_item[h][0].h].v = v*w;//储存
annex_item[h][annex_item[h][0].h].w = w;
}
}
for(int i=1;i<=main_item[0].h;i++){
for(int j=1;j<=annex_item[i][0].h;j++){//对附件进行0-1背包
w=annex_item[i][j].w;
v=annex_item[i][j].v;
for(int x=s-main_item[i].w;x>=w;x--){
dp_f[i][x]=max(dp_f[i][x],dp_f[i][x-w]+v);
}
}
w=main_item[i].w;
v=main_item[i].v;
for(int j=s;j>=w;j--){//对主件进行0-1背包
dp[j]=max(dp[j],max(dp[j-w]+v,dp[j-w]+v+dp_f[i][s-w]));
}
}
cout << dp[s];
return 0;
}
by 旭日临窗 @ 2020-10-31 18:36:51
@Grace25
我把我的代码发给你吧
#include <bits/stdc++.h>
using namespace std;
const int maxn = 3.2 * 1e4 + 10;
int n,m,V,p,q,v[100],w[100],fw[100][5],fv[100][5],dp[maxn];
int main()
{
scanf("%d%d",&n,&m);
for(int i = 1;i <= m;i++)
{
scanf("%d%d%d",&V,&p,&q);
if(q == 0)
{
v[i] = p * V;
w[i] = V;
}
else
{
fv[q][0]++;
fv[q][fv[q][0]] = V * p;
fw[q][fv[q][0]] = V;
}
}
for(int i = 1;i <= m;i++)
{
for(int j = n;j >= w[i];j--)
{
dp[j] = max(dp[j],dp[j - w[i]] + v[i]);
if(j >= w[i] + fw[i][1]) dp[j] = max(dp[j],dp[j - w[i] - fw[i][1]] + v[i] + fv[i][1]);
if(j >= w[i] + fw[i][2]) dp[j] = max(dp[j],dp[j - w[i] - fw[i][2]] + v[i] + fv[i][2]);
if(j >= w[i] + fw[i][1] + fw[i][2]) dp[j] = max(dp[j],dp[j - w[i] - fw[i][1] - fw[i][2]] + v[i] + fv[i][1] + fv[i][2]);
}
}
printf("%d",dp[n]);
return 0;
}