算法设计第6章20题 完全背包变形
2014-11-19 10:11
211 查看
题意:n门考试,共H小时复习,每门考试分配hi小时复习时间可以获得的成绩遵循fi(hi)函数(f函数非减,值域定义域均为整数)。求分配方案使得最后的总成绩最高。
思路:与完全背包思路类似,将时间花费看成重量,将成绩函数f看成价值。与完全背包的区别在于f函数不是随重量增加而增加固定的价值量,以及花费0时间也能产生价值fi(0)。
dp[i][j]表示考虑前i门课程,花费j时间下能够得到的最优成绩。f函数用f[i][j]表示:第i门课花费j小时能够获得的成绩。
初始化:dp[0][j] = 0 , 。
状态转移方程:dp[i][j] = max(dp[i][j] , maxk( dp[i-1][k] + f [i][j-k] )) ,j从0到H,i从1到n。
滚动数组优化需要注意不能优化到1维,因为前面的元素被填充后用了多少本次的课程并没有记录。所以至少需要dp[2][H].
思路:与完全背包思路类似,将时间花费看成重量,将成绩函数f看成价值。与完全背包的区别在于f函数不是随重量增加而增加固定的价值量,以及花费0时间也能产生价值fi(0)。
dp[i][j]表示考虑前i门课程,花费j时间下能够得到的最优成绩。f函数用f[i][j]表示:第i门课花费j小时能够获得的成绩。
初始化:dp[0][j] = 0 , 。
状态转移方程:dp[i][j] = max(dp[i][j] , maxk( dp[i-1][k] + f [i][j-k] )) ,j从0到H,i从1到n。
滚动数组优化需要注意不能优化到1维,因为前面的元素被填充后用了多少本次的课程并没有记录。所以至少需要dp[2][H].
#include <stdio.h> #define max(a,b) ((a)>(b)?(a):(b)) #define N 100 int dp[2] ,f ,n,h; int res ; int main(){ freopen("a.txt","r",stdin); while(scanf("%d %d",&n,&h)!=EOF){ int i,j,k,a=0,b=1; for(i = 1;i<=n;i++) for(j = 0;j<=h;j++) scanf("%d",&f[i][j]); for(i = 1;i<=n;i++){ for(j = 0;j<=h;j++){ for(k = 0;k<=j;k++){ dp[b][j] = max(dp[b][j],dp[a][k]+f[i][j-k]); } } b=!b; a=!a; } printf("%d\n",dp[a][h]); } }
相关文章推荐
- 完全背包的变形POJ1252
- 【算法复习三】算法设计技巧与优化----各种背包问题总结
- 中国象棋程序的设计与实现(十二)--棋盘绘制算法(尽管注释非常详细,完全理解仍有难度)
- 完全背包变形--hdu-1114-Piggy-Bank
- 最新的一个面试的算法题目——一个完全背包问题
- 【算法】完全背包问题
- UVA 10313(完全背包变形)
- UVA 10313(完全背包变形)
- sdut 2934 人活着系列之平方数 (完全背包变形)
- hdu 1284 钱币兑换问题(完全背包 变形---求方案总数)
- 【算法设计】背包问题
- 一些算法(最短路,线段树,01,完全背包,STL)的基本参考资料
- hdu 1398 Square Coins 完全背包变形
- poj 1882完全背包变形
- 【算法复习三】算法设计技巧与优化----各种背包问题总结
- zoj 2014 || poj 1384 Piggy-Bank(完全背包简单变形。)
- O(NV)的完全背包算法 及 HDU 4508 湫湫系列故事——减肥记I (完全背包)
- 中国象棋程序的设计与实现(十二)--棋盘绘制算法(尽管注释非常详细,完全理解仍有难度)
- 算法->完全背包问题 UVa 674 Coin Change
- SOJ 3664 chess towers 【完全背包变形】