dp(装箱)
Posted lipu123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dp(装箱)相关的知识,希望对你有一定的参考价值。
请小伙伴们对自己AC的题目进行标记,注意每人只能标记一次!不知道的不要标记,恶意标记者将回收账号!!!
题目描述
有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数)。
要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。
输入
第一行为一个整数,表示箱子容量;
第二行为一个整数,表示有n个物品;
接下来n行,每行一个整数表示这n个物品的各自体积。
第二行为一个整数,表示有n个物品;
接下来n行,每行一个整数表示这n个物品的各自体积。
输出
一个整数,表示箱子剩余空间。
样例输入 Copy
24
6
8
3
12
7
9
7
样例输出 Copy
0
箱子剩余最小则让其装的最多
dp[j]=max(dp[j],dp[j-a[i]+a[i])
#pragma GCC optimize(2) #include<bits/stdc++.h> using namespace std; inline int read() {int x=0,f=1;char c=getchar();while(c!=‘-‘&&(c<‘0‘||c>‘9‘))c=getchar();if(c==‘-‘)f=-1,c=getchar();while(c>=‘0‘&&c<=‘9‘)x=x*10+c-‘0‘,c=getchar();return f*x;} typedef long long ll; const int maxn=100000; const int M=1e7+10; const int INF=0x3f3f3f3f; int dp[maxn]; int a[maxn]; int main() { int v,n; cin>>v>>n; for(int i=1;i<=n;i++){ cin>>a[i]; } 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]); } } printf("%d",v-dp[v]); return 0; }
以上是关于dp(装箱)的主要内容,如果未能解决你的问题,请参考以下文章