背包问题I |
难度级别:B; 运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B |
试题描述
|
有一个背包容积为 V 和 n 个物品,并给出每个物品有一个体积。要求从 n 个物品中,任取若干个装入背包内,使背包的剩余空间为最小。 |
输入
|
第一行两个正整数 V 和 n,分别表示背包的容积和待装物品的个数;第二行包括 n 个正整数,表示 n 个物品的体积,两两之间有一个空格分隔。
|
输出
|
一个数,表示背包中剩余空间的最小值
|
输入示例
|
24 6
8 3 12 7 9 7 |
输出示例
|
0
|
其他说明
|
数据范围:0<V≤20000,0<n≤30
|
真是太简单了,转移方程:dp[j]=max(dp[j],dp[j-a[i]]+a[i]);。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 int main() 5 { 6 int v,n; 7 cin>>v>>n; 8 int a[n],dp[v+1]; 9 memset(dp,0,sizeof(dp)); 10 for(int i=0;i<n;i++) 11 { 12 cin>>a[i]; 13 for(int j=v;j>=a[i];j--) 14 dp[j]=max(dp[j],dp[j-a[i]]+a[i]); 15 } 16 cout<<v-dp[v]; 17 }