for(int i=0; i<N; i++)//循环一边,选和不选都max了一遍
{
for(v=volume[i]; v<=m; v++)
{
//从小到大,从小到大是叠加的过程,也就是从多次选择同一个类型,一个叠加一个,到最大值时,相当于叠加了很多个一样大小空间类型的物件,这就是完全背包问题!!!!!!!!!!!!!!!!!
还有一个简单的优化↓_↓
当一个物品的价值小于另一个物品的价值,但是价格高于另一个物品,我们就可以不去考虑这个物品。即若两件物品i、j满足c[i]<=c[j]且w[i]>=w[j],则将物品j去掉,不用考虑。我们为什么要买一个又贵又难吃的东西呢(╯▽╰),可以进行一个简单的排序,把又便宜又好吃的东西放在队首,进行优先运算。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <string>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxm=2001,maxn=101;
int n,m,v,i,num;
int value[maxn],volume[maxn];
int dp[maxm];
//int dp[1006];
//int value[1006];
//int volume[1006];
int main()
{
scanf("%d%d",&m,&num); //背包容量m和物品数量n
for(i=1; i<=num; i++)
scanf("%d%d",&value[i],&volume[i]);
for(i=1; i<=num; i++)
{
for(v=volume[i]; v<=m; v++)//设 f[v]表示重量不超过v公斤的最大价值
{ //这里是v++ 顺序 区别于01背包
dp[v] = max( dp[ v-volume[i] ] + value[i], dp[v]);
}
}
printf("%d\n", dp[m]); // f[m]为最优解
return 0;
}