题目描述

有一个箱子容量为 洛谷 P1047 装箱问题——————01背包_01背包 (正整数, 洛谷 P1047 装箱问题——————01背包_01背包_02 ),同时有 洛谷 P1047 装箱问题——————01背包_输入输出_03 个物品( 洛谷 P1047 装箱问题——————01背包_01背包_04 ,每个物品有一个体积(正整数)。

要求 洛谷 P1047 装箱问题——————01背包_输入输出_03 个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。

输入输出格式


输入格式:


洛谷 P1047 装箱问题——————01背包_01背包_06 个整数,表示箱子容量

洛谷 P1047 装箱问题——————01背包_01背包_06 个整数,表示有 洛谷 P1047 装箱问题——————01背包_输入输出_03 个物品

接下来 洛谷 P1047 装箱问题——————01背包_输入输出_03 行,分别表示这 洛谷 P1047 装箱问题——————01背包_输入输出_03 个物品的各自体积


输出格式:


洛谷 P1047 装箱问题——————01背包_01背包_06 个整数,表示箱子剩余空间。

输入输出样例



输入样例#1:

24 6 8 3 12 7 9 7



输出样例#1:

0




说明

NOIp2001普及组 第4题



01背包基础问题

 W−dp[W]    W − d p [ W ]   就是答案

#include<bits/stdc++.h>
using namespace std;
const int MAXN=20000+7;
int dp[MAXN];
int v[50],n,W;
int main()
{
while(~scanf("%d",&W))
{
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&v[i]);
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++)
for(int j=W;j>=v[i];j--)
dp[j]=max(dp[j],dp[j-v[i]]+v[i]);
printf("%d\n",W-dp[W]);
}
return 0;
}