试题请参见:
菜虫: (手执八公分直径炒锅, 筋)……你是白痴吗?-_-##(都派人去看守的话我们会有多少桌三缺一?!)
第一行一个正整数N(1<=N<=100)表示总共的娱乐项目数; 第二行一个正整数表示规定的时间t(0<t<1000); 下面有N行,其中第i+2行有两个正整数fi(0<=fi<=100)和ti(0<ti<=100), 分别表示对项目i的“喜欢度”和它所耗费的时间.
最大的“喜欢度”之和.
我的第一反应是回溯, 然后就TLE了 - -|||
其实这是非常典型的0-1背包问题, 然后就按照0-1背包问题的思想求解就好.
一开始用回溯, 虽然我剪枝(最优性剪枝)了, 可依旧大半的测试点超时.
用0-1背包问题思想求解的时候, 第0行和第0列需要预留空白(0), 否则当计算第一个值的时候会数组下标越界.
#include <iostream>
#include <fstream>const int MAX_PROJECTS = 101;
const int MAX_TIME = 1001;struct Project {int happiness;int time;Project() {this->happiness = 0;this->time = 0;}
};Project projects[MAX_PROJECTS];
int values[MAX_PROJECTS][MAX_TIME];int getMaxHappiness(int totalProjects, int totalTime) {for ( int i = 1; i <= totalProjects; ++ i ) {for ( int j = 0; j <= totalTime; ++ j ) {if ( j >= projects[i].time ) {values[i][j] = std::max(values[i - 1][j], values[i - 1][j - projects[i].time] + projects[i].happiness);} else {values[i][j] = values[i - 1][j];}}}return values[totalProjects][totalTime];
}int main() {using std::cin;// std::ifstream cin;// cin.open(");int n = 0, t = 0;cin >> n >> t;for ( int i = 1; i <= n; ++ i ) {cin >> projects[i].happiness >> projects[i].time;}int maxHappiness = getMaxHappiness(n, t);std::cout << maxHappiness << std::endl;return 0;
}
本文发布于:2024-03-08 22:29:49,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/1710122436133374.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |