poj1276/作业题O
做题时漏掉的点:dp状态更新覆盖掉了之前的状态
反思点:降维时要考虑之前的状态是否会被覆盖掉
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <stdlib.h>
#include<vector>
#define N 10
#define maxn 10010
#define maxnn 100010
using namespace std;
int a[N];
int v[N];
int t[maxn];
int dp[maxnn];
#define inf 0x3f3f3f3f
int main()
{
int vol, n;
while (cin >> vol >> n)
{
for (int i = 0; i < n; i++)
{
cin >> a[i];
cin >> v[i];
}
int j = 1;
for (int i = 0; i < n; i++)
{
int temp = 1;
while (a[i] >= temp)
{
t[j++] = v[i] * temp;
a[i] -= temp;
temp *= 2;
}
if (a[i]) t[j++] = a[i] * v[i];
}
memset(dp, 0, sizeof(dp));
dp[0] = 1;
for (int i = 0; i < j; i++)
{
for (int j = vol; j >= t[i]; j--)
{
if (dp[j - t[i]])dp[j] = dp[j - t[i]];
//核心状态更新部分
//我之前写的是:dp[j] = dp[j - t[i]];
//这样可能导致之前的状态被覆盖掉
//因为有些可以装的可能被赋值为不能装状态
}
}
for (int i = vol; i >= 0; i--)
{
if (dp[i]) { cout << i << endl; break; }
}
}
return 0;
}