标签:
还是使用动态规划(Dynamic Planning)
问题描述:
-------------------------------------------------------------------------------------------------------------------------
背包问题
设有n种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为K,今从n种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于K,而价值的和为最大。
输入数据:
第一行两个数:物品总数N,背包载重量K;两个数用空格分隔;
第二行N个数,为N种物品重量;两个数用空格分隔;
第三行N个数,为N种物品价值; 两个数用空格分隔.
输出数据:
第一行总价值.
输入样例:
4 10
2 3 4 7
1 3 5 9
输出样例:
12
-------------------------------------------------------------------------------------------------------------------------
法一:
1 #include "iostream" 2 #include "cstdio" 3 #define MAXN 8102050 4 using namespace std; 5 int n,w[MAXN],v[MAXN]; 6 int k; 7 int f[MAXN]; 8 int main() 9 10 { 11 cin>>n>>k; 12 for (int i=1;i<=k;i++) 13 f[i]=-2100000; 14 for (int i=1;i<=n;i++) 15 cin>>w[i]; 16 for (int i=1;i<=n;i++) 17 cin>>v[i]; 18 f[0]=0; 19 for (int i=1;i<=n;i++) 20 for (int wei=w[i];wei<=k;wei++) 21 f[wei]=(f[wei-w[i]]+v[i]>f[wei])?f[wei-w[i]]+v[i]:f[wei]; 22 cout<<f[k]; 23 return 0; 24 }
法二:
待续....
标签:
原文地址:http://www.cnblogs.com/RoitAGI/p/5666385.html