sak_ma @ 2018-10-24 15:34:47
emmm......本蒟蒻用了最朴素的方法,然后问题在于:
using namespace std;
int t,n;
struct yan {
int a;
int b;
int c;
} u[55];
long long dp[100005];
bool cmp(const yan &x, const yan &y) { return x.by.c>y.bx.c; }
int main() {
cin>>t>>n;
for(int i=1; i<=n; i++)
cin>>u[i].a;
for(int i=1; i<=n; i++)
cin>>u[i].b;
for(int i=1; i<=n; i++)
cin>>u[i].c;
sort(u+1,u+n+1,cmp);
for(int i=1; i<=n; i++)
for(int j=t; j>=u[i].c; j--)
dp[j]=max(dp[j],dp[j-u[i].c]+u[i].a-(long long)j*u[i].b);
long long M=-1;
for(int i=1;i<=t;i++)
M=max(M,dp[i]);
cout<<M;
return 0;
} 本蒟明白为什么最后要遍历一遍求最大的,却不明白这里:
for(int j=t; j>=u[i].c; j--)
dp[j]=max(dp[j],dp[j-u[i].c]+u[i].a-(long long)j*u[i].b);
为什么dp[j]=max(dp[j],......)而不是dp[j]=max(dp[1...j]......)。 求大佬赐教
by zzsqwq @ 2018-10-24 15:39:52
对 dp[j]当前这个状态进行更新
有选这个物品和不选这个物品
不选就是原来状态不变dp[j]
选了就是后方那个
qwq可能是错的因为我也很弱
by King_of_gamers @ 2018-10-24 15:49:47
希望更丰富的展现?使用Markdown
by Everlasting_Snow @ 2018-10-24 15:50:09
希望更丰富的展现?使用Markdown
by hellomath @ 2018-10-24 15:50:39
希望更丰富的展现?使用Markdown
by Juanzhang @ 2018-10-24 15:57:21
@larryzhong %%%
by hellomath @ 2018-10-24 16:24:27
@小光 %%%
by sak_ma @ 2018-10-24 18:48:58
@zzsqwq 问题在于dp[i]j表示到第i个食物为止,恰在第j秒完成对第i个食物的烹饪的最大价值而非前j秒的最大价值。
by Mevinsp @ 2019-01-22 19:22:39
希望更丰富的展现?使用Markdown
by Double_Y @ 2019-07-25 11:04:11
希望更丰富的展现?使用Markdown