168 条题解
-
0lijian LV 5 @ 2007-07-29 23:23:48
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms
简单二维背包!! -
02007-07-29 22:59:50@
普通搜……
-
02007-07-29 22:48:03@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms -
02007-07-29 20:15:57@
这次拖鞋啊
-
02007-07-29 19:58:42@
多开一维限制条件
-
02007-07-29 20:01:39@
双限制背包..
2维数组就可以完成了 -
-12016-11-03 15:39:28@
贴一个纯天然未优化,思路看起来明显的。。。话说同等时空复杂度下C/C++貌似比Pascal快那么一些些
#include <iostream> #include <fstream> #include <vector> #include <algorithm> using namespace std; const int maxv = 400 + 10; const int maxn = 50 + 10; int dp[maxn][maxv][maxv]; int u[maxn], v[maxn], w[maxn]; int main() { #ifdef LOCAL freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); #endif int U, V; cin >> U >> V; int N; cin >> N; for (int i = 1; i <= N; ++i) cin >> u[i] >> v[i] >> w[i]; for (int i = 1; i <= N; ++i) for (int j = 1; j <= U; ++j) for (int k = 1; k <= V; ++k) dp[i][j][k] = max(dp[i-1][j][k], (j >= u[i] && k >= v[i]) ? dp[i-1][j-u[i]][k-v[i]] + w[i] : dp[i-1][j][k]); int ans = 0; for (int i = 1; i <= U; ++i) for (int j = 1; j <= V; ++j) if (dp[N][i][j] >= ans) ans = dp[N][i][j]; cout << ans << endl; return 0; }
-
-12016-09-10 22:26:26@
#include <iostream> #include <algorithm> using namespace std; struct { int v,m,c; //v为食物占用的体积,m为食物占用的重量,c为食物卡路里数 } item[55]; //存储每个食物的信息 int maxv,maxm,n,f[55][410][410]; //maxv,maxm分别为最大体积和最大质量,f[i][j][k]代表将前i个食物放入可用体积为j,可用重量为k的背包中生成卡路里数的最优解 int main(){ cin >> maxv >> maxm >> n; for(int i = 1; i <= n;i++){ cin >> item[i].v >> item[i].m >> item[i].c; //输入每个食物的数据 } for(int i = 0; i <= n;i++){ f[i][0][0] = 0; } for(int i = 0; i <= maxv;i++){ f[0][i][0] = 0; } for(int i = 0; i <= maxm;i++){ f[0][0][i] = 0; } //上面的三个for循环是初始化 //核心代码开始 for(int i = 1; i <= n;i++){ for (int j = 1; j <= maxv; j++) { for (int k = 1; k <= maxm; k++) { f[i][j][k] = max((j >= item[i].v && k >= item[i].m ? f[i-1][j-item[i].v][k - item[i].m]+item[i].c:f[i-1][j][k]),f[i-1][j][k]); //当且仅当第i个食物的体积小于等于j,重量小于等于k时才能被放入背包,此时需要比较到底是放了之后卡路里更大还是不放卡路里更大,如果把第i个食物放进背包,则相当于把前i-1个食物放入可用体积为j,可用重量为k的背包中,然后再把第i个食物装进去(即把第i个食物的卡路里数加上)。如果第i个食物不能够装进去,就直接用f[i-1][j][k],因为这个时候卡路里数没有发生变化 } } } //核心代码结束 cout << f[n][maxv][maxm] << endl; //输出f[n][maxv][maxm]就是这道题的解 }