题目:http://acm.hdu.edu.cn/showproblem.php?pid=1114
以下有三种做法,自己在网上找的。
自己开始学习背包问题,感觉这几种做的方法都好,
题解:想求重量为W(k)时的最小价值V(k),给定的重量选择为weight[],对应的价值分别为value[];
则若知道W(k)的前一步W(k-1)时所对应的价值,
由于W(k-1)+weight[i] = W(k),只要遍历value[]数组,得
出V(k)的最小值即可,,,,,,,,,,,,,,,,
dp[k] = 0…………k = 0;
dp[k] = min(value[j] + dp[k - weight[j]])…………k >= weight[j];
其中,1=< j <= n,若dp[k - weight[j]]) = -1,表示它是无穷大,重量不能达到
#include <stdio.h>
#include <string.h>
struct coin
{
};
coin cc[501];
int dp[10001];
int main()
{
}
***************************************************
若dp[i](重量为i时的最小值)是已知的,此时让重量在i基础上向前滚动,weight[j](1=<j<=n)的距离,
同时让dp[i+weight[j]]与dp[i]+value[j]作比较,
使得dp[i+weight[j]]={dp[i+weight[j]], dp[i]+value[j]}.
这样得到的dp[k](令i+weight[j]=k)不一定是最小的,可能以后的滚动还要修改它,
只有dp[i]是确定的,以后无论怎么滚动都不会再滚到它了。
直至滚到total值时,全部比较完后停止
#include <iostream>
#include <algorithm>
using namespace std;
struct coin
{
};
coin cc[501];
int dp[10001];
bool comp(coin a, coin b)
{
}
int main()
{
}
********************************************
#include <stdio.h>
int main()
{
}