我是星星 @ 2017-08-30 15:06:13
#include<iostream>
using namespace std;
int v[100],f[100][32001],k,r[100],p[100],o[100],n,m;
int main()
{
cin>>m>>n;
for(int i=1;i<=n;i++)
{
cin>>v[i]>>p[i]>>o[i]; //分别读入为物品i的价值,重要度,主件序号
}
k=n;
for(int i=1;i<=n;i++)
if(o[i])
if(r[o[i]]==0)
{
v[++k]=v[o[i]]+v[i];p[k]=p[o[i]]+p[i];r[o[i]]=i; //r[i]表示物件i的第一个附件的序号
v[i]=0;p[i]=0; //o[i]表示物件i的主件的序号
}
else
{
v[++k]=v[o[i]]+v[i]+v[r[o[i]]];p[k]=p[o[i]]+p[i]+p[r[o[i]]];
v[++k]=v[o[i]]+v[i];p[k]=p[o[i]]+p[i];
v[i]=0;p[i]=0;
}
for(int i=1;i<=k;i++)
for(int j=m;j>=1;j--)
if(v[i]<=j)
f[i][j]=max(f[i-1][j],f[i-1][j-v[i]]+v[i]*p[i]);
else f[i][j]=f[i-1][j];
cout<<f[k][m];
return 0;
}
求帮忙
by angleの奏 @ 2017-08-30 17:00:47
@2556937429lq 你的代码问题很多,还在帮你改
by 我是星星 @ 2017-08-30 17:08:47
嗯
by 我是星星 @ 2017-08-30 17:09:10
十分感谢你,谢谢
by 我是星星 @ 2017-08-30 17:15:15
#include<iostream>
#define max(x,y) ((x>y)?x:y)
using namespace std;
int dp[32005];
int n,m;
int v[65][4],s[65][4],sum[65]={0},maxn;
int main()
{
cin>>n>>m; //m是物品数,n是金钱数
for (int i=1;i<=m;i++)
{int V,S,k;
cin>>V>>S>>k; //读入每个物品的价格,重要度,主件序号
if(!k){ //如果是主件的话
v[i][0]=V;
s[i][0]=S*V; //s【i】【0】表示该物品的比价
sum[i]++; //该分组的物品数加一
}
else
{
v[k][sum[k]]=V+v[k][0]; //在该分组下保存数据
s[k][sum[k]]=S*V+s[k][0];
sum[k]++;
if(sum[k]==3) //如果有两个附件和一个主件了
{
v[k][sum[k]]=v[k][1]+v[k][2]-v[k][0]; //将两个附件打包
s[k][sum[k]]=s[k][1]+s[k][2]-s[k][0];
sum[k]++;
}
}
}
for (int i=1;i<=m;i++) //从物品数开始循环
{
if (v[i][0]) //如果有主件的话
for (int j=n;j>=0;j--) //从总金钱数循环
{
for (int k=0;k<sum[i];k++) //从该组的物品数量循环
if (v[i][k]<=j) dp[j]=max(dp[j],dp[j-v[i][k]]+s[i][k]); //01背包问题
}
}
for (int i=0;i<=n;i++)
maxn=max(maxn,dp[i]); //寻找最大值
cout<<maxn;
}
by 我是星星 @ 2017-08-30 17:15:53
你看我这个代码适合背诵吗
by angleの奏 @ 2017-08-30 17:30:36
@2556937429lq 你该出来了??
by angleの奏 @ 2017-08-30 17:31:17
改出来了???
by 我是星星 @ 2017-08-30 17:57:51
不是我的
by 我是星星 @ 2017-08-30 18:58:18
大师,你还在该吗