2 条题解
-
2
注意注意:这道题数值很大,请不要为了节省内存而运用vector(因为最后一个如果用标准输入输出流cout、cin可达到998ms)建议用c语言。
我是被害了好几次了思路
如果只有两天,那就是一个完全背包问题,体积是第一天的价格,价值是第二天的价格。不过有很多天,所以是相邻两天做一次完全背包。
代码
#include <stdio.h> #include <string.h> inline int max(register int a,register int b){ return a>b?a:b; } int main(void){ register int s,d,m; scanf("%d%d%d",&s,&d,&m); register int f[500001]; register int a[51][11]; for(register int i=1;i<=s;i++) for(register int j=1;j<=d;j++) scanf("%d",&a[i][j]); for(register int k=2;k<=d;k++){ memset(f,0,sizeof(f)); for(register int i=1;i<=s;i++) for(register int j=a[i][k-1];j<=m;j++) f[j]=max(f[j],f[j-a[i][k-1]]+a[i][k]-a[i][k-1]); m+=f[m]; } printf("%d",m); return 0; } //已AC,最后一项510ms
-
1
假设只有两天,那么相当于完全背包问题,体积是第一天的价格,价值是第二天的价格。而如果有d天,则相当于每相邻两天做一次完全背包,一共d-1次。
核心代码
for (int i = 2; i <= d; i++) { maxx = -1; memset(f, 0, sizeof(f)); for (int j = 1; j <= s; j++) for (int k = v[j][i - 1]; k <= m; k++) { f[k] = max(f[k], f[k - v[j][i - 1]] + v[j][i] - v[j][i - 1]); maxx = max(maxx, f[k]); } m += maxx; } cout << m;
- 1
信息
- ID
- 390
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- (无)
- 递交数
- 361
- 已通过
- 170
- 上传者