经典的背包问题

背包问题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]);。

 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 }
View Code
你——悟到了么?
原文地址:https://www.cnblogs.com/wxjor/p/5432704.html