解题思路:
注意事项:
参考代码:
双重状态数组,我无敌了。
#include<iostream> #include<cstdio> #include<cstring> #define maxn 2020 using namespace std; int n,ti[maxn],sum_tot,f[maxn][maxn],rmb[maxn],m,rp[maxn],r,sum[maxn][maxn]; int read()//读入优化,背过即可 { int x=0; char ch=getchar(); while(ch<'0'||ch>'9') ch=getchar(); while(ch>='0'&&ch<='9') { x=x*10+ch-'0'; ch=getchar(); } return x;} int main() { n=read(); for(int i=1;i<=n;++i) { rmb[i]=read(); rp[i]=read(); ti[i]=read(); //应该都是题目给的变量,不过time改成ti,貌似time是个特殊玩意== } m=read();r=read(); //差不多就是个01背包,然后j,v就这么出来,比普通的多了一层 for(int i=1;i<=n;++i) for(int j=r;j>=rp[i];--j) for(int v=m;v>=rmb[i];--v) { if(sum[j][v]<sum[j-rp[i]][v-rmb[i]]+1) { sum[j][v]=sum[j-rp[i]][v-rmb[i]]+1;//sum数组代表泡到最多mm f[j][v]=f[j-rp[i]][v-rmb[i]]+ti[i];//更新泡到最多mm时的花费时间 } if(sum[j][v]==sum[j-rp[i]][v-rmb[i]]+1) { f[j][v]=min(f[j][v],f[j-rp[i]][v-rmb[i]]+ti[i]); //如果已经泡到了目前阶段最多的mm,则更新一下最少的时间 } } printf("%d\n",f[r][m]);//想一想,普通01背包的f后面(成员)不是也跟着个最大值吗 return 0;} 一定要点赞!!!!!!!!!
0.0分
3 人评分
2004年秋浙江省计算机等级考试二级C 编程题(1) (C语言代码)浏览:754 |
分糖果 (C++代码)浏览:855 |
C语言程序设计教程(第三版)课后习题11.3 (C语言代码)浏览:887 |
C二级辅导-进制转换 (C语言代码)浏览:819 |
C语言训练-阶乘和数* (C语言代码)浏览:981 |
C语言程序设计教程(第三版)课后习题3.7 (C++代码)浏览:988 |
简单的a+b (C语言代码)浏览:520 |
C语言程序设计教程(第三版)课后习题6.9 (C语言代码)浏览:762 |
C语言程序设计教程(第三版)课后习题7.1 (C语言代码)浏览:1222 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:481 |