P1049 装箱问题

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;
}
posted @ 2020-12-08 11:41  goverclock  阅读(93)  评论(0编辑  收藏  举报