标签:
多重背包。
每个物品分别dp。。
dp[i][j]表示考虑了前i个物品。。装满j的背包。。第i个物品最少拿多少个
3 10 1 2 4 2 1 1 2 5 1 4 2 1 0 0
8 4
#include <bits/stdc++.h>
using namespace std;
#define prt(k) cerr<<#k" = "<<k<<endl
const int N = 102;
const int M = 100002;
int dp[2][M];
const int inf = 0x3f3f3f3f;
int n, m;
int a[N], c[N];
int main()
{
int re, ca=1;
while (cin >> n >> m , n)
{
for (int i=1; i<=n; i++) scanf("%d", a+i);
for (int i=1; i<=n; i++) scanf("%d", c+i);
memset(dp ,63, sizeof dp);
int u = 1;
for (int i=0;i<=c[1] && a[1]*i<=m; i++) dp[u][a[1]*i] = i;
for (int i=2; i<=n; i++)
{
u = 1 - u;
memset(dp[u], 63, sizeof dp[u]);
dp[ u ][0] = 0;
for (int j=1; j<=m; j++)
{
if (dp[ 1 - u ][j] <= c[i-1] )
dp[u][j] = 0;
else if (j >= a[i])
{
dp[u][j] = min(dp[u][j], dp[ u ][j-a[i]] + 1);
}
}
}
int ans = 0;
for (int i=1; i<=m; i++) if ( dp[u][i] <= c[n] ) ans ++;
cout<<ans<<endl;
}
}
标签:
原文地址:http://blog.csdn.net/oilover/article/details/45748617