UVA 674 Coin Change(完全背包求解方案数)

题目链接: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-1dp[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;
}

 

你可能感兴趣的:(背包问题,DP)