题目链接:https://vjudge.net/problem/UVA-674
解题思路:
情景:一定容量V的包,有n样物品,每样无数件,重量wi,价值vi,问你背包最多有多少种可以装满的不同方案?
做法:
①dp[j] 表示当前只装前i件物品最大的价值
②状态转移方程:dp[j] =(j>=w[i])? dp[j]+dp[j-w[i]] : dp[j] ;
如果当前的背包不能装下第i件物品,那么就等于前i-1件dp[j]的方案数;
如果可以放下,那么前i件的方案首先要包括不放这件物品前i-1件物品的方案数 + 放上这件物品之后,剩余空间放前i件物品的方案数。
③初始状态:dp[0] = 1,其余正常初始化为0
④时间复杂度:O(N*V) 空间复杂度:O(V)
代码:
#include
#include
#include
using namespace std;
int v[6]={0,1,5,10,25,50};
int dp[7500];
int main()
{
int V;
while (~scanf("%d",&V)){
memset(dp,0,sizeof dp);
dp[0] = 1;
for (int i=1;i<=5;i++)
for (int j=0;j<=V;j++)
if (j>=v[i])dp[j] += dp[j-v[i]];
printf("%d\n",dp[V]);
}
return 0;
}