第一行有2个正整数n和c。n是集装箱数,c是轮船的载重量。第2行中有n个正整数,表示集装箱的重量(0
5 10
7 2 6 5 4
10
动态规划-01背包问题
#include
using namespace std;
int main()
{
int n,c,a[10005];
int dp[10005]={0};
while(cin>>n>>c)
{
for(int i=0;i>a[i];
for(int j=c;j>=a[i];j--)
dp[j]=min(dp[j],dp[j-a[i]]+a[i]);
}
cout<
3 10
1
2
5
10
完全背包思想
#include
#include
using namespace std;
long long a[5005];//数比计较大
int main()
{
int n,m,k;
while(cin>>n>>m)
{
a[0]=1;
for(int i=0;i>k;
for(int j=k;j<=m;j++)
a[j]+=a[j-k];
}
cout<
300 4
100 60
250 120
120 100
35 20
605
动态规划-完全背包问题
#include
using namespace std;
#define N 10000+5
int main()
{
int tm,n;
cin>>tm>>n;
int score[N],time[N];
int dp[N]={0};
for(int i=0;i>score[i]>>time[i];
for(int i=0;idp[j])
dp[j]=dp[j-time[i]]+score[i];
}
cout<
某条街上每一公里就有一汽车站,乘车费用如下表:
公里数 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
费用 |
12 |
21 |
31 |
40 |
49 |
58 |
69 |
79 |
90 |
101 |
12 21 31 40 49 58 69 79 90 101
15
147
动态规划-完全背包问题
#include
#include
using namespace std;
int main()
{
int a[11],k;
int dp[5005];
memset(dp,101,sizeof(dp));
dp[0]=0;
for(int i=1;i<=10;i++)
cin>>a[i];
cin>>k;
for(int i=1;i<=10;i++)
for(int j=i;j<=k;j++)
dp[j]=min(dp[j],dp[j-i]+a[i]);
cout<
第一行:两个整数,M(背包容量,M<=200)和N(物品数量,N<=30);
第2..N+1行:每行二个整数Wi,Ci,表示每个物品的重量和价值。
10 4
2 1
3 3
4 5
7 9
max=12
#include
#include
#include
using namespace std;
#define N 30+5
int main()
{
int n,m;
int a[N],b[N],d[205];
while(cin>>m>>n)
{
memset(d,0,sizeof(d));
for(int i=0;i>a[i]>>b[i];
for(int i=0;i
悼念512汶川大地震遇难同胞——珍惜现在,感恩生活Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 34540 Accepted Submission(s): 14544
Problem Description
急!灾区的食物依然短缺!
为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种大米,每种大米都是袋装产品,其价格不等,并且只能整袋购买。 请问:你用有限的资金最多能采购多少公斤粮食呢? 后记: 人生是一个充满了变数的生命过程,天灾、人祸、病痛是我们生命历程中不可预知的威胁。 月有阴晴圆缺,人有旦夕祸福,未来对于我们而言是一个未知数。那么,我们要做的就应该是珍惜现在,感恩生活—— 感谢父母,他们给予我们生命,抚养我们成人; 感谢老师,他们授给我们知识,教我们做人 感谢朋友,他们让我们感受到世界的温暖; 感谢对手,他们令我们不断进取、努力。 同样,我们也要感谢痛苦与艰辛带给我们的财富~
Input
输入数据首先包含一个正整数C,表示有C组测试用例,每组测试用例的第一行是两个整数n和m(1<=n<=100, 1<=m<=100),分别表示经费的金额和大米的种类,然后是m行数据,每行包含3个数p,h和c(1<=p<=20,1<=h<=200,1<=c<=20),分别表示每袋的价格、每袋的重量以及对应种类大米的袋数。
Output
对于每组测试数据,请输出能够购买大米的最多重量,你可以假设经费买不光所有的大米,并且经费你可以不用完。每个实例的输出占一行。
Sample Input
18 22 100 44 100 2
Sample Output
400
Author
lcy
Source
2008-06-18《 ACM程序设计》期末考试——四川加油!中国加油!
Recommend
lcy | We have carefully selected several similar problems for you: 1114 2602 2159 1171 1059
|
#include
#include
#include
using namespace std;
#define N 105
int main()
{
int n,m,i,j,k;
int a[N],b[N],c[N],d[205];
int t;
cin>>t;
while(t--)
{
cin>>m>>n;
memset(d,0,sizeof(d));
for(i=0;i>a[i]>>b[i]>>c[i];
for(i=0;i=a[i];k--)
d[k]=max(d[k],d[k-a[i]]+b[i]);
cout<
一个旅行者有一个最多能用V公斤的背包,现在有n件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分别为C1,C2,...,Cn。有的物品只可以取一次(01背包),有的物品可以取无限次(完全背包),有的物品可以取的次数有一个上限(多重背包)。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
第一行:二个整数,V(背包容量,V<=200),N(物品数量,N<=30);
第2..N+1行:每行三个整数Wi,Ci,Pi,前两个整数分别表示每个物品的重量,价值,第三个整数若为0,则说明此物品可以购买无数件,若为其他数字,则为此物品可购买的最多件数(Pi)。仅一行,一个数,表示最大总价值。
10 3
2 1 0
3 3 1
4 5 4
11
动态规划-背包问题
#include
#include
#include
using namespace std;
struct bag{
int wi;
int pi;
int num;
}a[35];
int dp[205];
int main()
{
int v,n;
while(cin>>v>>n)
{
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
cin>>a[i].wi>>a[i].pi>>a[i].num;
for(int i=1;i<=n;i++)
{
if(a[i].num==1)
{
for(int j=v;j>=a[i].wi;j--)
dp[j]=max(dp[j],dp[j-a[i].wi]+a[i].pi);
}
else if(a[i].num==0){
for(int j=a[i].wi;j<=v;j++)
dp[j]=max(dp[j],dp[j-a[i].wi]+a[i].pi);
}
else {
for(int k=1;k<=a[i].num;k++)
for(int j=v;j-k*a[i].wi>=0;j--)
{
dp[j]=max(dp[j],dp[j-a[i].wi]+a[i].pi);
}
}
}
cout<
第一行二个数n(n<=500),m(m<=6000),其中n代表希望购买的奖品的种数,m表示拨款金额。
接下来n行,每行3个数,v、w、s,分别表示第I种奖品的价格、价值(价格与价值是不同的概念)和购买的数量(买0件到s件均可),其中v<=100,w<=1000,s<=10。
第一行:一个数,表示此次购买能获得的最大的价值(注意!不是价格)。
5 1000;80 20 4;40 50 9;30 50 7;40 30 6;20 20 1
1040
#include
#include
#include
using namespace std;
int dp[6005];
struct prize{
int v,w,s;
}a[505];
int main(){
int n,m;
while(cin>>n>>m)
{
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
cin>>a[i].v>>a[i].w>>a[i].s;
for(int i=1;i<=n;i++)
{
for(int k=1;k<=a[i].s;k++)
{
for(int j=m;j>=a[i].v;j--)
dp[j]=max(dp[j],dp[j-a[i].v]+a[i].w);
}
}
cout<
第一行两个数体积最大值(<400)和质量最大值(<400)
第二行 一个数 食品总数N(<50).
第三行-第3+N行
每行三个数 体积(<400) 质量(<400) 所含卡路里(<500)
一个数 所能达到的最大卡路里(int范围内)
320 350;4;160 40 120;80 110 240;220 70 310;40 400 22
550
#include
#include
using namespace std;
int dp[400][400];
struct food{
int vi,mi,kl;
}a[405];
int main()
{
int v,m,n;
cin>>v>>m>>n;
for(int i=1;i<=n;i++)
cin>>a[i].vi>>a[i].mi>>a[i].kl;
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
for(int j=v;j>=a[i].vi;j--)
for(int k=m;k>=a[i].mi;k--)
dp[j][k]=max(dp[j][k],dp[j-a[i].vi][k-a[i].mi]+a[i].kl);
}
cout<