Code Vs 1014 装箱

    xiaoxiao2021-03-25  100

    有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数)。

    要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。

    输入描述 Input Description 一个整数v,表示箱子容量 一个整数n,表示有n个物品 接下来n个整数,分别表示这n 个物品的各自体积

    输出描述 Output Description 一个整数,表示箱子剩余空间。

    样例输入 Sample Input 24 6 8 3 12 7 9 7

    样例输出 Sample Output 0

    大体思路:

    基本的背包问题,dp[j]表示在空间为j的情况下所能取得的最大值。 状态转移方程:dp[j]=max(dp[j],dp[j-a[i]]+a[i]) 前提是j>=a[i]

    代码:

    #include<iostream> #include<algorithm> #include<cstdio> using namespace std; int a[31]; int dp[20005]; int main() { int v,n; while(cin>>v>>n) { for(int i=1;i<=n;++i){ cin>>a[i]; // dp[i]=v; } dp[0]=0; for(int i=1;i<=n;++i){ for(int j=v;j>=a[i];--j){ dp[j]=max(dp[j],dp[j-a[i]]+a[i]); } } cout<<v-dp[v]<<endl; } return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-17166.html

    最新回复(0)