利刃随人 @ 2019-10-15 10:47:12
RT,思路应该看了一遍大家都明白,实现的时候跑出问题了,怎么检查也检查不出来=-=求大佬救救孩子!!
#include<iostream>
#include<cstdio>
#define maxm 61
#define maxn 32001
using namespace std;
struct Item{
int price,good;
bool fs;
}it[maxm];
int fs[maxm][3],f[maxn],ans;
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
it[i].price=x;
it[i].good=y;
if(z>0)
{
it[i].fs=true;
for(int j=1;j<=2;j++)
{
if(fs[z][j]) continue;
fs[z][j]=i;
}
}
}
for(int i=1;i<=m;i++)
for(int j=n;j>=it[i].price;j--)
{
if(it[i].fs) continue;
f[j]=max(f[j],f[j-it[i].price]+it[i].price*it[i].good);
if(j>=it[i].price+it[fs[i][1]].price)
f[j]=max(f[j],f[j-it[i].price-it[fs[i][1]].price]+it[i].price*it[i].good+it[fs[i][1]].price*it[fs[i][1]].good);
if(j>=it[i].price+it[fs[i][2]].price)
f[j]=max(f[j],f[j-it[i].price-it[fs[i][2]].price]+it[i].price*it[i].good+it[fs[i][2]].price*it[fs[i][2]].good);
if(j>=it[i].price+it[fs[i][1]].price+it[fs[i][2]].price)
f[j]=max(f[j],f[j-it[i].price-it[fs[i][1]].price-it[fs[i][2]].price]+it[i].price*it[i].good+it[fs[i][2]].price*it[fs[i][2]].good+it[fs[i][1]].price*it[fs[i][1]].good);
}
printf("%d",f[n]);
return 0;
}
by 利刃随人 @ 2019-10-15 11:07:29
已经知道了=-= 在维护fs[][]的时候少加了一句break;
加了就A了。