【openjudge_ 简单英文题_18:Coins】

题目

18:Coins
总时间限制: 1000ms 内存限制: 65536kB
描述
There are N kinds of coins. Each kind of coins has a value V and a weight W. Tony wants to go traveling. Unfortunately, he can only carry coins of which the total weight is not greater than K. How much total value of coins can he carry at most?

输入
First line: two positive integers N (N <= 100) and K (K <= 1000).
Next N lines: the i-th line two positive integers V and W (V,W <= 1000) indicating the value and the weight of the i-th coin.
输出
One integer indicating the total value of coins at most.
样例输入
3 7
1 2
2 3
4 5
样例输出
5

翻译

题目:硬币
描述:
有N种硬币。每种硬币都有一个值V和一个重量W。托尼想去旅行。不幸的是,他只能携带总重量不超过K的硬币。他最多能携带多少硬币的总价值?
输入:
第一行:两个正整数N(N<=100)和K(K<=1000)。
接下来的N行:第i行是两个正整数V和W(V,W<=1000),表示第i个硬币的值和重量。
输出:
最多一个整数,表示硬币的总价值。

代码

#include <bits/stdc++.h>
#include <windows.h>
using namespace std;
const int N=101;
int n,
k,
v[N],
w[N],
f[N][1010];//几个硬币时,多少重量所能得到的最大价值
void view(){
cout<<“重量: \t”;for(int j=0;j<=k;j++)cout<<j<<“\t”;cout<<endl;
for(int i=0;i<=n;i++){
cout<<i<<" “<<w[i]<<”,“<<v[i]<<”=\t";
for(int j=0;j<=k;j++)cout<<f[i][j]<<“\t”;cout<<endl;
}
cout<<endl;
}
int main(){
freopen(“data.cpp”,“r”,stdin);
cin>>n>>k;
for(int i=1;i<=n;i++)cin>>v[i]>>w[i];
for(int i=1;i<=n;i++)
for(int j=0;j<=k;j++){
cout<<j<<endl;
if(w[i]>j)f[i][j]=f[i-1][j];//重量不够该硬币,最优价值就不取该硬币
else f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+v[i]);//重量够,就是取不取该硬币的最大值。取就是在少该硬币的最优解+该硬币的价值
view();
}
cout<<f[n][k];
return 0;
}

小结

典型的动态规划,背包问题,但是wrong,我想可能时该题的判断有问题。
网上也有人这么说
网上的ac代码:
#include
using namespace std;
int a[1010];
int m,n,w,v;
int main(){
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>w>>v;
for(int j=n;j>=w;j–)//j=n,是数量,错,应该是总重量
a[j]=max(a[j],a[j-w]+v);//j-w也错,应该是j-输入的第二个数(重量)
}
view();
cout<<a[n];//该输出a[m]。
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值