码迷,mamicode.com
首页 > 其他好文 > 详细

P1049 装箱问题

时间:2020-12-14 13:17:51      阅读:2      评论:0      收藏:0      [点我收藏+]

标签:==   tar   mamicode   string   i++   代码   size   clu   using   

P1049 装箱问题

背包问题的简化版本.

类似的还有

P2639 [USACO09OCT]Bessie‘s Weight Problem G

P2925 [USACO08DEC]Hay For Sale S

技术图片

 

所谓剩余空间最小,即在有限的空间里放最多的物品.

如果把物体的体积看作w[i],且物体的体积也看作v[i],你会发现这是01背包问题,只不过w[i]和v[i]相等,W即箱子的体积.

#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;

int W, n, s[510];
int dp[45010];

int main() {
    cin >> W >> n;
    for (int i = 0; i < n; i++) cin >> s[i];

    for (int i = 0; i < n; i++)
        for (int j = W; j >= s[i]; j--)
            dp[j] = max(dp[j], dp[j - s[i]] + s[i]);

    cout << W - dp[W] << endl;
    
    return 0;
}

(以上代码不保证AC)

先前的AC代码:

#include <algorithm>
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;

int n, V, dp[50][20000];
int s[50];

int rec(int i, int v)
{
    if(dp[i][v] >= 0) return dp[i][v]; 
    int res;
    if(i == n) res = v;
    else if(s[i] > v) res = rec(i + 1, v);
    else res = min(rec(i + 1, v - s[i]), rec(i + 1, v));

    return dp[i][v] = res;
}

int main()
{
    cin >> V >> n;
    memset(dp, -1, sizeof(dp));
    for(int i = 0; i < n; i++) cin >> s[i];
    
    printf("%d\n", rec(0, V));

    return 0;
}

P1049 装箱问题

标签:==   tar   mamicode   string   i++   代码   size   clu   using   

原文地址:https://www.cnblogs.com/Gaomez/p/14100691.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!