裝箱問題<DP><C++>

題目

  • 題目:給出n個物品的體積,選取其中若干個物品裝入容量爲v的箱子中,剩餘空間最小爲多少?輸出這個最小值.
  • 輸入格式:
    • 第一行,輸入箱子的容量v.
    • 第二行,輸入物品的個數n.
    • 接下來n行,輸入每個物品的體積.
  • 輸出格式:僅一行,輸出箱子最小剩餘空間.
  • 例子:
    • input:
    • 24
    • 6
    • 8
    • 3
    • 12
    • 7
    • 9
    • 7
    • output:
    • 0

分析

  • f[v]來表示前i個物品放入容量爲v的箱子中的最大體積,d[i]表示第i個物品的體積,則狀態轉移方程爲f[v]=max(f[v],f[v-d[i]]+d[i]),我們要的結果就在f[v]中.

程序

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int main(){
    int v,n;
    scanf("%d%d",&v,&n);
    int d[n+1],f[v+1];
    memset(f,0,sizeof(f));
    for(int i=1;i<=n;i++) scanf("%d",&d[i]);
    for(int i=1;i<=n;i++)
        for(int j=v;j>=1;j--)
            if(j>=d[i]) f[j]=max(f[j],f[j-d[i]]+d[i]);
    printf("%d",v-f[v]);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章