完全背包中每种物品的数量是无穷多个。
与01背包差别的地方,更新dp[i][j]是顺序更新,因为每个背包可以无限次选择,状态 dp[ i ][ j ]恰好可以由可能已经放入物品i的状态 dp[ i ] [ j - list[i].w]转换过来
#include <iostream>
#include <memory.h>
using namespace std;
int n,m;
int need[505];
int value[505];
int dp[100005];
int main()
{
cin >> n >> m;
for( int i = 1; i <= n; i++ )
cin >> need[i] >> value[i];
for( int i = 1; i <= n; i++ )
for( int j = need[i]; j <= m; j++ )
dp[j] = max(dp[j], dp[j-need[i]] + value[i] );
cout << dp[m] << endl;
return 0;
}