宇道人 @ 2016-07-25 21:24:35
f(i,j)表示购买第i件物品,花费为j时的最大“价格与重要度乘积和”;
f(0,j)表示花费为j时(不考虑选用了哪些物品)最大的“价格与重要度乘积和”
代码(错了6,7,8,9四个点):
#include<iostream>
#include<stdio.h>
using namespace std;
int f[62][32010]={};
int v[62]={},w[62]={},q[62]={};
int maxn(int a,int b)
{
if(a>b)return a;
else return b;
}
int main()
{
int i=0,j=0,k=0;
int n,m;
cin>>n>>m;
n=n/10;
for(i=1;i<=m;i++)
{
cin>>v[i]>>w[i]>>q[i];
w[i]=w[i]*v[i];
v[i]=v[i]/10;
} //读入
for(i=1;i<=m;i++)if(q[i]==0 && v[i]<=n)
{
for(j=n;j>0;j--)if(f[0][j] && j+v[i]<=n)
{
for(k=1;k<i;k++)if(f[k][j])
f[k][j+v[i]]=maxn(f[k][j+v[i]],f[k][j]+w[i]);
f[0][j+v[i]]=maxn(f[0][j+v[i]],f[0][j]+w[i]);
f[i][j+v[i]]=maxn(f[0][j]+w[i],f[i][j+v[i]]);
}
f[0][v[i]]=maxn(f[0][v[i]],w[i]);
f[i][v[i]]=maxn(w[i],f[i][v[i]]);
} //计算主件
for(i=1;i<=m;i++)if(q[i]!=0 && v[i]<=n)
for(j=n;j>0;j--)if(f[q[i]][j] && j+v[i]<=n)
{
f[0][j+v[i]]=maxn(f[0][j+v[i]],f[q[i]][j]+w[i]);
f[q[i]][j+v[i]]=maxn(f[q[i]][j+v[i]],f[q[i]][j]+w[i]);
} //在主件基础上计算附件
int ans=0;
for(i=1;i<=n;i++)if(ans<f[0][i])ans=f[0][i];
cout<<ans;
return 0;
}
by 宇道人 @ 2016-07-25 21:39:53
好吧没事了,方程推错了